gpt4 book ai didi

c# - 来自 MemberExpression 的反射类型

转载 作者:太空狗 更新时间:2023-10-29 20:30:42 24 4
gpt4 key购买 nike

给定这段代码:

static void Main(string[] args)
{
Expression<Func<SomeDerivedClass, object>> test = i => i.Prop;
var body = (UnaryExpression) test.Body;
Console.WriteLine(((MemberExpression) body.Operand).Member.ReflectedType);
}

public class SomeClass
{
public int Prop { get; private set; }
}

public class SomeDerivedClass : SomeClass
{
}

我希望 ReflectedType 是 SomeDerivedClass,因为它是表达式的参数类型。但它是 SomeClass,如果我理解正确的话,它是声明类型。

这是为什么?

最佳答案

关于如何构建表达式树的精确细节在很大程度上是未指定的。唯一重要的是表达式树对应于用于构建表达式树的 C# 语法。在普通的 C# 表达式中,只有 DeclaringType 的等效项,它在 IL 中进行了编码。该成员根本无法通过反射访问,因此无需考虑 ReflectedType。因为没有要考虑的 ReflectedType,所以两个不同的 PropertyInfo 对象与原始源代码对应得同样好。

出于一个潜在的原因,请考虑这个有点邪恶的派生类:

public class SomeClass
{
public int Prop { get; set; }
}

public class SomeDerivedClass : SomeClass
{
public int get_Prop() { return 4; }
}

在这里,基类的 Prop getter 没有被覆盖,但是编译器生成的原始 get_Prop 属性getter 函数只能通过基类使用。因此,Prop 唯一正确的属性 getter 是 SomeClass.get_PropSomeDerivedClass.get_Prop 不得 使用,即使在静态已知为 SomeDerivedClass 的对象上访问 Prop .

结合这一事实,在内部,C# 编译器生成的构建表达式树的代码通过获取属性 getter 方法获取适当的 PropertyInfo 对象,并要求运行时找到相应的 PropertyInfo,你就有了答案:属性 getter 方法只能从 SomeClass 可靠地获取,因此你也将从 获取 PropertyInfo >一些类

关于c# - 来自 MemberExpression 的反射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23105567/

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