gpt4 book ai didi

c# - Lambda 表达式未返回预期的 MemberInfo

转载 作者:IT王子 更新时间:2023-10-29 04:30:17 26 4
gpt4 key购买 nike

我遇到了一个我没想到的问题。一个例子可能比一段话更能说明我的问题:

更新:跳到最后一个代码块以获得更 Eloquent 代码示例。

public class A
{
public string B { get; set; }
}

public class C : A { }

下面是一个方法的一些代码:

var a = typeof(C).GetMember("B")[0];
var b = typeof(A).GetMember("B")[0];

Expression<Func<C, string>> c = x => x.B;

var d = (c.Body as MemberExpression).Member;

下面是一些比较的结果:

a == b //false
a == d //false
b == d //true

前两个有点出乎意料。我知道即使 B 不是虚拟的,C 也可以用 new 运算符定义一个同名的属性,但在这种情况下我没有。

第二个对我来说确实是最令人惊讶的(也是我问题的核心)。即使 lambda 的参数被明确定义为 C 类型,它仍然返回它,就好像该属性是从基类访问的一样。

我正在寻找的是一种从 lambda 表达式中获取 MemberInfo 的方法,就像我对参数类型使用反射来获取 MemberInfo 一样。我的项目基本上将 MemberInfos 存储在各种字典中,它需要具有可以通过提供 lambda 表达式访问元素的功能。

Danny Chen 重述的代码示例

public class Base
{
public string Name { get; set; }
}
public class Derived : Base { }

//in Main
var parentMember = typeof(Base).GetMember("Name")[0];
var childMember = typeof(Derived).GetMember("Name")[0];

Expression<Func<Base, string>> parentExp = x => x.Name;
var parentExpMember = (parentExp.Body as MemberExpression).Member;

Expression<Func<Derived, string>> childExp = x => x.Name;
var childExpMember = (childExp.Body as MemberExpression).Member;

parentMember == childMember //false, good
parentMember == parentExpMember //true, good
childMember == childExpMember //false, why?

最佳答案

获取表达式的(第一个)参数的类型,然后说

Expression<Func<C, string>> c = x => x.B; 
Type paramType = c.Parameters[0].Type; // first parameter of expression
var d = paramType.GetMember((c.Body as MemberExpression).Member.Name)[0];

关于c# - Lambda 表达式未返回预期的 MemberInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658669/

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