Lambda expression not returning expected MemberInfo
c#, lambda
Solution
Take the type of the expression's (first) parameter, and say
Expression<Func<C, string>> c = x => x.B;
Type paramType = c.Parameters[0].Type; // first parameter of expression
var d = paramType.GetMember((c.Body as MemberExpression).Member.Name)[0];
Problem
I'm running into a problem that I did not expect. An example will probably illustrate my question better than a paragraph: UPDATED: Skip to last code-block for a more eloquent code example. ``` public class A { public string B { get; set; } } public class C : A { } ``` Here is some code from a method: ``` 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; ``` Here are the results of some comparisons: ``` a == b //false a == d //false b == d //true ``` The first two are somewhat unexpected. I understand that even though B is not virtual, C could define a property with the same name with thew `new` operator, but in this case I did not. The second is really the most surprising to me (and is the heart of my problem). Even though the parameter for the lambda is clearly defined as being of type C, it still returns it as if the property was accessed from the base class. What I'm looking for is a way to get the MemberInfo from a lambda expression as if I had used reflection on the type of the parameter to get the MemberInfo. My project essentially stores MemberInfos in a dictionary of sorts and it needs to have functionality where you can access the elements by providing a lambda expression. Restated code sample by 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? ```