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

如何使用C#中的反射检索对子对象的引用?,c#,reflection,interface,C#,Reflection,Interface,我正在尝试使用C#中使用反射的duck类型。我有一个随机类型的对象,我想知道它是否实现了一个具有特定名称的接口,如果实现了,请检索对该接口子对象的引用,以便以后可以通过该接口读取(获取)属性值 实际上,我需要作为使用反射的 第一部分很简单 var interfaceOfInterest = randomObject.GetType().GetInterface("Full.Interface.Name.Here"); 它将检索接口描述或null。让我们假设它不是空的 现在我有了一个对象引

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

实际上,我需要
作为使用反射的

第一部分很简单

var interfaceOfInterest =
   randomObject.GetType().GetInterface("Full.Interface.Name.Here");
它将检索接口描述或null。让我们假设它不是空的

现在我有了一个对象引用,指向一个确实实现了该接口的对象


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

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

下面是一个程序,演示:

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"; } }
}

出于某种原因,这在我的例子中不起作用-我有一些巨大的继承层次结构,既没有
动态的
绑定,也没有使用
GetValue()
处理对象接口,所以我需要访问子对象。没有子对象这样的东西。你能发布一个简短但完整的例子,详细说明你遇到的问题吗?如果你把C转换成I,你可以把它转换回去,如果有一个子对象实现了C的I,你就不能转换回去,GC就会乱成一团。因此,如果将C强制转换为I,该引用仍然表示C对象。不管怎样,我发现问题是因为调用
GetProperty()
时使用了错误的引用。正如你所描述的那样。非常感谢。