gpt4 book ai didi

c# - 类型成员的表达式导致不同的表达式(MemberExpression、UnaryExpression)

转载 作者:IT王子 更新时间:2023-10-29 03:55:25 26 4
gpt4 key购买 nike

描述

我有一个表达式指向我的类型的属性。但它不适用于所有属性类型。 "不是意思"是什么意思它导致不同的表达类型。我以为它会导致MemberExpression 但事实并非如此。

对于 intGuid 它产生一个 UnaryExpression 而对于 stringMemberExpression 中。

我有点困惑;)

一些示例代码

我的类(class)

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

测试代码

Person p = new Person { Age = 16, Name = "John" };

Expression<Func<Person, object>> expression1 = x => x.Age;
// expression1.Body = UnaryExpression;

Expression<Func<Person, object>> expression2 = x => x.Name;
// expression2.Body = MemberExpression;

问题

我如何比较两个表达式并检查它们是否均值相同的类型和相同的属性?

更新、回答并完成示例

感谢用户 dasblinkenlight 让我走上正轨。

他提供了方法

private static MemberExpression GetMemberExpression<T>(
Expression<Func<T,object>> exp
) {
var member = expr.Body as MemberExpression;
var unary = expr.Body as UnaryExpression;
return member ?? (unary != null ? unary.Operand as MemberExpression : null);
}

我编写了以下扩展方法来比较 GetMemberExpression 的结果方法并检查 GetMemberExpression().Member.Name 是否相同。

private static bool IsSameMember<T>(this Expression<Func<T, object>> expr1, Expression<Func<T, object>> expr2)
{
var result1 = GetMemberExpression(expr1);
var result2 = GetMemberExpression(expr2);

if (result1 == null || result2 == null)
return false;

return result1.Member.Name == result2.Member.Name;
}

最佳答案

发生这种情况的原因是 Age是一个类型。为了将返回值类型的表达式强制转换为 Func<Person,object>编译器需要插入一个 Convert(expr, typeof(object)) , 一个 UnaryExpression .

对于 string s 和其他引用类型,但是,不需要装箱,因此返回一个“直接”成员表达式。

如果你想去 MemberExpressionUnaryExpression里面,可以得到它的操作数:

private static MemberExpression GetMemberExpression<T>(
Expression<Func<T,object>> exp
) {
var member = exp.Body as MemberExpression;
var unary = exp.Body as UnaryExpression;
return member ?? (unary != null ? unary.Operand as MemberExpression : null);
}

关于c# - 类型成员的表达式导致不同的表达式(MemberExpression、UnaryExpression),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12975373/

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