如何使用C#中的Reflection检索对子对象的引用?

时间:2014-02-10 09:31:10

标签: c# reflection interface

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

有效地,我需要as使用反射。

第一部分很简单

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

将检索接口描述或null。我们假设它不是空的。

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

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

1 个答案:

答案 0 :(得分:2)

您不需要通过接口类型只访问接口的属性,但只要您需要传递实例,只需传递原始对象实例。

这是一个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"; } }
}