如何在 x => x.property 中获取 ContstantExpression 的名称和值
How to get the name and value of ContstantExpression in x => x.property
我正在创建一种在 C# 中获取表达式的 Name
和 Value
的简单方法。但是,我发现了一个我无法弄清楚的案例。请看下面的代码:
public void GetValue_Object_TIn_Property_Test()
{
string val = "value";
var tuple = Tuple.Create(new object(), val);
Expression<Func<object, string>> expression = x => tuple.Item2;
Assert.AreEqual(val, expression.GetValue());
}
.GetValue()
方法是我的扩展方法。
基本上这个表达式树由一个 LambdaExpression
、两个 MemberExpression
和一个 ConstantExpression
依次组成。
当我尝试获取 tuple.Item2
的名称时,我从最后一个 MemberExpression
中获取 memberExpression.Member.Name
。这给了我 "tuple" 而不是 "Item2"。 我怎样才能得到 "Item2"?
此外,当我尝试获取表达式的值时,我得到了整个元组而不是 Item2
。我正在使用以下方法获取值:
public override bool TryGetValue(
MemberExpression memberExpression,
out T value
) {
value = default(T);
bool success = false;
var fieldInfo = memberExpression.Member as FieldInfo;
if (success = (fieldInfo != null))
{
var valueObj = fieldInfo.GetValue(expression.Value);
if (success = (valueObj is T || valueObj == null))
{
value = (T)valueObj;
}
}
return success;
}
其中 MemberExpression
又是最后一个 MemberExpression
。 我在这里做错了什么? 我遗漏的具体情况是什么?
提前致谢
实际上,树是一个 LambdaExpression
,其 Body
是一个 PropertyExpression
,它有一个 Member
字段,Name
为 "Item2" 和一个 Expression
即 FieldExpression
用于获取 tuple
的值。请注意 PropertyExpression
和 FieldExpression
是从 MemberExpression
.
继承的内部类型
因此您需要获取 (Body as MemberExpression).Member.Name
而不是 Body.Expression.Member.Name
。
将树视为 MemberExpression
(get Member
:Item2 from Expression
:MemberExpression
(get Member
:tuple from Expression
:[周围class])).
你用过LINQPad吗?它的 Dump()
命令可以向您展示这个以及更多。
我正在创建一种在 C# 中获取表达式的 Name
和 Value
的简单方法。但是,我发现了一个我无法弄清楚的案例。请看下面的代码:
public void GetValue_Object_TIn_Property_Test()
{
string val = "value";
var tuple = Tuple.Create(new object(), val);
Expression<Func<object, string>> expression = x => tuple.Item2;
Assert.AreEqual(val, expression.GetValue());
}
.GetValue()
方法是我的扩展方法。
基本上这个表达式树由一个 LambdaExpression
、两个 MemberExpression
和一个 ConstantExpression
依次组成。
当我尝试获取 tuple.Item2
的名称时,我从最后一个 MemberExpression
中获取 memberExpression.Member.Name
。这给了我 "tuple" 而不是 "Item2"。 我怎样才能得到 "Item2"?
此外,当我尝试获取表达式的值时,我得到了整个元组而不是 Item2
。我正在使用以下方法获取值:
public override bool TryGetValue(
MemberExpression memberExpression,
out T value
) {
value = default(T);
bool success = false;
var fieldInfo = memberExpression.Member as FieldInfo;
if (success = (fieldInfo != null))
{
var valueObj = fieldInfo.GetValue(expression.Value);
if (success = (valueObj is T || valueObj == null))
{
value = (T)valueObj;
}
}
return success;
}
其中 MemberExpression
又是最后一个 MemberExpression
。 我在这里做错了什么? 我遗漏的具体情况是什么?
提前致谢
实际上,树是一个 LambdaExpression
,其 Body
是一个 PropertyExpression
,它有一个 Member
字段,Name
为 "Item2" 和一个 Expression
即 FieldExpression
用于获取 tuple
的值。请注意 PropertyExpression
和 FieldExpression
是从 MemberExpression
.
因此您需要获取 (Body as MemberExpression).Member.Name
而不是 Body.Expression.Member.Name
。
将树视为 MemberExpression
(get Member
:Item2 from Expression
:MemberExpression
(get Member
:tuple from Expression
:[周围class])).
你用过LINQPad吗?它的 Dump()
命令可以向您展示这个以及更多。