我遇到了一个我没有预料到的问题。 一个示例可能比一段话更能说明我的问题:
更新:跳转到最后的代码块以获取更优雅的代码示例。
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也可以使用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?