我正在尝试使用C#中的反射进行鸭子打字。我有一个随机类型的对象,我想找到它是否实现了具有特定名称的接口,如果它实现 - 检索对该接口子对象的引用,以便稍后我可以通过该接口读取(获取)属性值。
有效地,我需要as
使用反射。
第一部分很简单
var interfaceOfInterest =
randomObject.GetType().GetInterface("Full.Interface.Name.Here");
将检索接口描述或null。我们假设它不是空的。
所以现在我有一个对象引用,它肯定会实现该接口。
如何使用仅反射检索子对象的“强制转换”?
答案 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"; } }
}