У меня проблема, которую я не ожидал.Пример, вероятно, проиллюстрирует мой вопрос лучше, чем абзац:
ОБНОВЛЕНО: перейдите к последнему блоку кода для более красноречивого примера кода.
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
, но в этом случае я этого не сделал.
Второй действительно самый удивительный для меня (и это сердце моей проблемы).Несмотря на то, что параметр для лямбды четко определен как тип C, он все равно возвращает его, как если бы к свойству обращались из базового класса.
То, что я ищу, - это способ получить MemberInfoиз лямбда-выражения, как если бы я использовал отражение в типе параметра, чтобы получить MemberInfo.По сути, мой проект хранит MemberInfos в своего рода словаре, и он должен иметь функциональность, позволяющую получить доступ к элементам, предоставляя лямбда-выражение.
Образец пересмотренного кода Дэнни Чена
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?