Espressione Lambda che non restituisce l’Info membro previsto

Sto incontrando un problema che non mi aspettavo. Un esempio probabilmente illustrerà la mia domanda meglio di un paragrafo:

AGGIORNATO: passa all’ultimo blocco di codice per un esempio di codice più eloquente.

public class A { public string B { get; set; } } public class C : A { } 

Ecco un codice da un metodo:

 var a = typeof(C).GetMember("B")[0]; var b = typeof(A).GetMember("B")[0]; Expression<Func> c = x => xB; var d = (c.Body as MemberExpression).Member; 

Ecco i risultati di alcuni confronti:

 a == b //false a == d //false b == d //true 

I primi due sono alquanto inaspettati. Capisco che anche se B non è virtuale, C potrebbe definire una proprietà con lo stesso nome con il new operatore, ma in questo caso non l’ho fatto.

Il secondo è davvero il più sorprendente per me (ed è il cuore del mio problema). Anche se il parametro per lambda è chiaramente definito come di tipo C, lo restituisce comunque come se la proprietà fosse accessibile dalla class base.

Quello che sto cercando è un modo per ottenere MemberInfo da un’espressione lambda come se avessi usato il reflection sul tipo di parametro per ottenere MemberInfo. Il mio progetto essenzialmente memorizza MemberInfos in un dizionario di sorta e ha bisogno di avere funzionalità in cui è ansible accedere agli elementi fornendo un’espressione lambda.

Esempio di codice rideterminato di 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> parentExp = x => x.Name; var parentExpMember = (parentExp.Body as MemberExpression).Member; Expression<Func> childExp = x => x.Name; var childExpMember = (childExp.Body as MemberExpression).Member; parentMember == childMember //false, good parentMember == parentExpMember //true, good childMember == childExpMember //false, why?