最简单的方法是展示一个示例(LinqPad)代码,以演示目前存在的问题:
我对为什么
void Main()
{
GetProp<IFace>().DeclaringType.Dump(); // iface
GetProp<C>().DeclaringType.Dump(); // iface
GetProp().DeclaringType.Dump(); // c
}
public interface IFace { int A { get; set; } }
public class C : IFace { public int A { get; set; } }
public PropertyInfo GetProp<T>() where T : IFace
{
return ExtractProperty((T x) => x.A);
}
public PropertyInfo GetProp()
{
return ExtractProperty((C x) => x.A);
}
private PropertyInfo ExtractProperty<T, V>(Expression<Func<T, V>> exp)
{
return (PropertyInfo) ((MemberExpression) exp.Body).Member;
}
我对为什么
GetProp<C>
使用返回IFace
上的属性而不是C
上的属性感到好奇。有人能解释这种行为吗?从IL代码
中可以看出,GetProp<T>
的通用版本在IFace
类型上使用了ldtoken,但为什么要以这种方式实现呢?有人能指向这种行为的理由或规范吗?
System.Object
。 - SLaks