【问题标题】:How do I retrieve a reference to a subobject using Reflection in C#?如何在 C# 中使用反射检索对子对象的引用?
【发布时间】:2014-02-10 09:31:09
【问题描述】:

我正在尝试通过 C# 中的反射来使用鸭子类型。我有一个随机类型的对象,我想知道它是否实现了具有特定名称的接口,如果它实现了 - 检索对该接口子对象的引用,以便我以后可以通过该接口读取(获取)属性值。

实际上我需要as 使用反射。

第一部分很简单

var interfaceOfInterest =
   randomObject.GetType().GetInterface("Full.Interface.Name.Here");

这将检索接口描述或为空。让我们假设它不为空。

所以现在我有一个对肯定实现该接口的对象的对象引用。

如何仅使用反射来进行子对象的“强制转换”检索?

【问题讨论】:

    标签: c# reflection interface


    【解决方案1】:

    你不需要,简单地通过接口类型访问接口的属性,但是当你需要传递一个实例时,只需传递原始对象实例。

    这是一个 LINQPad 程序演示:

    void Main()
    {
        var c = new C();
        // TODO: Check if C implements I
        var i = typeof(I);
        var valueProperty = i.GetProperty("Value");
        var value = valueProperty.GetValue(c);
        Debug.WriteLine(value);
    }
    
    public interface I
    {
        string Value { get; }
    }
    
    public class C : I
    {
        string I.Value { get { return "Test"; } }
    }
    

    输出:

    Test
    

    如果您想使用名称更多地访问它:

    void Main()
    {
        var c = new C();
        // TODO: Check if C implements I
        var i = c.GetType().GetInterface("I");
        if (i != null)
        {
            var valueProperty = i.GetProperty("Value");
            var value = valueProperty.GetValue(c);
            Debug.WriteLine(value);
        }
    }
    
    public interface I
    {
        string Value { get; }
    }
    
    public class C : I
    {
        string I.Value { get { return "Test"; } }
    }
    

    【讨论】:

    • 由于某种原因,这在我的情况下不起作用 - 我有一些巨大的继承层次结构,dynamics 绑定和 GetValue() 都不能与对象接口一起使用,所以我需要去子对象。
    • 没有子对象这样的东西。您能否发布一个简短但完整的示例,详细说明您遇到的问题?如果将 C 转换为 I,则可以将其转换回,如果有子对象为 C 实现了 I,则无法转换回,GC 将完全失控。因此,如果将 C 转换为 I,则该引用仍然代表 C 对象。
    • 无论如何,我发现问题是因为我在调用GetProperty() 时使用了错误的引用。它像你描述的那样工作。谢谢。
    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多