gpt4 book ai didi

c# - 如何从表达式中获取子声明类型?

转载 作者:可可西里 更新时间:2023-11-01 08:08:27 26 4
gpt4 key购买 nike

我有一个父/子类层次结构,其中父类抽象地声明了一个字符串属性,子类实现了它:

abstract class Parent
{
public abstract string Value { get; }
}

class Child : Parent
{
public override string Value { get { return null; } }
}

当我使用显式(或隐式)使用 Child 类的表达式时,我希望表达式的 MemberInfo 的 DeclaringType 为“Child”,但实际上是 Parent:

Child child = new Child();
Expression<Func<string>> expression = (() => child.Value);
MemberInfo memberInfo = expression.GetMemberInfo();
Assert.AreEqual(typeof(Child), memberInfo.DeclaringType); // FAILS!

断言失败,因为 DeclaringType 是 Parent。

在声明我的表达式或使用它来揭示 Child 类型的实际使用时,我可以做些什么吗?

注意:上面的 GetMemberInfo() 作为扩展方法(我什至忘记我们已经写了这个!):

public static class TypeExtensions
{
/// <summary>
/// Gets the member info represented by an expression.
/// </summary>
/// <param name="expression">The member expression.</param>
/// <returns>The member info represeted by the expression.</returns>
public static MemberInfo GetMemberInfo(this Expression expression)
{
var lambda = (LambdaExpression)expression;

MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = (UnaryExpression)lambda.Body;
memberExpression = (MemberExpression)unaryExpression.Operand;
}
else memberExpression = (MemberExpression)lambda.Body;

return memberExpression.Member;
}
}

最佳答案

否 - 这是 C# 编译器发出的内容的准确表示。在寻找成员时,覆盖实际上被忽略了——编译器只关心最初声明成员的类型。您可以通过编译代码然后查看 IL 来亲眼看到这一点。这个方法:

static void Main()
{
Child c = new Child();
string x = c.Value;
}

被编译成这个 IL:

IL_0000:  nop
IL_0001: newobj instance void Child::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance string Parent::get_Value()
IL_000d: stloc.1
IL_000e: ret

一点琐事:VB 编译器以同样的方式工作,所以这个方法:

Public Shared Sub Main(Args As String())
Dim x As Child = New Child()
Dim y As String = x.Value
End Sub

编译为:

IL_0000:  newobj     instance void [lib]Child::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: callvirt instance string [lib]Child::get_Value()
IL_000c: stloc.1
IL_000d: ret

关于c# - 如何从表达式中获取子声明类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9466582/

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