我遇到了一个我没有预料到的问题。一个例子可能比一段话更能说明我的问题:
更新:跳到最后一个代码块以获得更雄辩的代码示例。
public class A
{
public string B { get; set; }
}
public class C : A { }
这是方法中的一些代码:
var a = typeof(C).GetMember("B")[0];
var b = typeof(A).GetMember("B")[0];
Expression<Func<C, string>> c = x => x.B;
var d = (c.Body as MemberExpression).Member;
以下是一些比较的结果:
a == b //false
a == d //false
b == d //true
前两个有点出乎意料。据我所知,即使 B 不是虚拟的,C 也可以定义与 w 同名的属性new
运算符,但在本例中我没有。
第二个对我来说确实是最令人惊讶的(也是我问题的核心)。即使 lambda 的参数被明确定义为 C 类型,它仍然返回它,就像从基类访问该属性一样。
我正在寻找一种从 lambda 表达式获取 MemberInfo 的方法,就像我使用参数类型的反射来获取 MemberInfo 一样。我的项目本质上将 MemberInfos 存储在某种字典中,并且它需要具有可以通过提供 lambda 表达式来访问元素的功能。
Danny Chen 重述的代码示例
public class Base
{
public string Name { get; set; }
}
public class Derived : Base { }
//in Main
var parentMember = typeof(Base).GetMember("Name")[0];
var childMember = typeof(Derived).GetMember("Name")[0];
Expression<Func<Base, string>> parentExp = x => x.Name;
var parentExpMember = (parentExp.Body as MemberExpression).Member;
Expression<Func<Derived, string>> childExp = x => x.Name;
var childExpMember = (childExp.Body as MemberExpression).Member;
parentMember == childMember //false, good
parentMember == parentExpMember //true, good
childMember == childExpMember //false, why?