gpt4 book ai didi

c# - LambdaExpression 为覆盖的属性获取不正确的 DeclaringType

转载 作者:行者123 更新时间:2023-11-30 16:39:10 24 4
gpt4 key购买 nike

我有以下类(class):

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;

当我检查 MemberExpression 的 DeclaringType 时,我得到的类型是 Foo 而不是我预期的 Bar。这是为什么?

var type = (expression.Body as MemberExpression).Member.DeclaringType;   // returns Foo type

最佳答案

所以这是一个棘手的问题。从技术上讲,Bar 声明一个属性,该属性称为 FooProperty。我们可以通过获取 BarType、获取它的 FooProperty 信息并打印它的声明类型来看到这一点。

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

将打印出 Bar,而不是 Foo。所以 Bar 声明了一个属性,但是,您显示的代码在 Foo 中显示结果的原因是 FooBar 声明一个名为 FooProperty 的属性,但在调用站点上它实际上并没有调用 Bar.FooProperty,它调用的是基类型的版本并让虚拟分派(dispatch)处理确保 Bar 声明的属性 是两个声明属性中实际执行的属性。这意味着被调用的属性的声明类型(这是您从表达式中获取成员信息时正在计算的内容,而不是像我上面那样通过导航类型来计算)是Foo,即使这两种类型都声明了一个名为 FooProperty 的属性。

关于c# - LambdaExpression 为覆盖的属性获取不正确的 DeclaringType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53504017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com