代码之家  ›  专栏  ›  技术社区  ›  Torbjörn Hansson

LambdaExpression为重写的属性获取不正确的DeclaringType

  •  3
  • Torbjörn Hansson  · 技术社区  · 7 年前

    我有以下课程:

    public class Foo
    {
        public virtual string FooProperty { get; set; }
    }
    public class Bar : Foo
    {
        public override string FooProperty { get => base.FooProperty; set => base.FooProperty = value; }
    }
    

    我定义一个lambda表达式:

    Expression<Func<Bar, string>> expression = (Bar b) => b.FooProperty;
    

    Foo 而不是 Bar 如我所料。为什么会这样?

    var type = (expression.Body as MemberExpression).Member.DeclaringType;   // returns Foo type
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Servy    7 年前

    所以这是一个棘手的问题。从技术上讲 Bar 声明一个属性,然后调用该属性 FooProperty Type 属于 酒吧 ,得到它 食品属性 信息与印刷 声明类型。

    var prop = typeof(Bar).GetProperty("FooProperty");
    Console.WriteLine(prop.DeclaringType);
    

    将打印出来 酒吧 Foo 酒吧 声明属性,但显示代码的原因会导致 两者都是吗 酒吧 食品属性 ,但在呼叫网站上,它实际上并没有呼叫 Bar.FooProperty ,它调用基类型的版本,并让虚拟分派处理,以确保 财产 酒吧 宣布 是两个声明属性中实际执行的属性。这意味着声明类型 (当您从表达式中获取成员信息时,而不是像我上面所做的那样从类型导航中获取成员信息时,您所计算的是)是 ,即使两种类型都声明了名为 .