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