Я пытаюсь использовать ExpressionVisitor
, чтобы получить переопределенный член выражения, но он дает мне base .Что мне здесь не хватает?
Следующий пример воспроизводит это поведение:
Простые базовые и производные типы:
class Base
{
public virtual string Property { get; set; }
}
class Derived : Base
{
public override string Property { get; set; }
}
Я использую это выражение посетитель:
internal class DemoVisitor : ExpressionVisitor
{
private MemberInfo _member;
public static MemberInfo GetMemberInfo(LambdaExpression expression)
{
var visitor = new DemoVisitor();
visitor.Visit(expression);
return visitor._member;
}
protected override Expression VisitMember(MemberExpression node)
{
// invalid member here
//node.Member.DeclaringType.Name.Dump();
_member = _member ?? node.Member;
return base.VisitMember(node);
}
}
Называя это так
void Main()
{
var derived = new Derived();
var expression = (Expression<Func<string>>)(() => derived.Property);
DemoVisitor.GetMemberInfo(expression).DeclaringType.Name.Dump();
}
Это возвращает Base
вместо Derived
.Что мне нужно сделать, чтобы попасть в переопределенный член?
Мне это нужно, потому что я читаю его атрибуты позже, и в настоящее время он дает мне атрибуты свойства базового класса вместо производного.