gpt4 book ai didi

特定字典项的 C# MemberExpression

转载 作者:太空狗 更新时间:2023-10-30 01:30:56 25 4
gpt4 key购买 nike

我正在尝试使用 Expression.MakeBinary 动态生成二进制表达式:

public static BinaryExpression MakeBinary(
ExpressionType binaryType,
Expression left,
Expression right
)

“Foo”类的属性“Bar”的一个简单示例是:

var param = Expression.Parameter(typeof(Foo));
var left = MemberExpression.Property(param, "Bar");
var propertyType = typeof(Foo).GetProperty("Bar").PropertyType;
var right = Expression.Constant(Convert.ChangeType("newValue", propertyType ));
var expression = Expression.MakeBinary(ExpressionType.Equal, left, right);

我的目标是能够做与上面相同的事情,但不是将“Bar”属性与“newValue”进行比较,在我的例子中,“Bar”是一个字典,我想比较该字典的特定条目与“新值(value)”。我想要实现的目标如下所示(但此代码无效):

var param = Expression.Parameter(typeof(Foo));
var left = MemberExpression.Property(param, "Bar[\"entryName\"]");

我想我正在尝试做的事情是可能的,但我似乎无法找到要使用的正确语法/类/方法。显然上面的代码返回了一个错误,因为 Bar["entryName"] 不是一个属性。但是,如何根据给定类型的字典中的特定条目构建表达式?

这个的高级应用是能够应用规则,使用 field/operator/compareValue 作为参数,但能够指示该字段的“路径”(取决于类,有时它会是一个普通的属性(property),或如此处所问,字典中的条目等)。

谢谢

最佳答案

您可以使用 Expression.MakeIndex() :

var param = Expression.Parameter(typeof(Foo));
var bar = MemberExpression.Property(param, "Bar");

Type dictionaryType = typeof(Foo).GetProperty("Bar").PropertyType;
PropertyInfo indexerProp = dictionaryType.GetProperty("Item");
var dictKeyConstant = Expression.Constant("entryName");
var dictAccess = Expression.MakeIndex(bar, indexerProp, new[] {dictKeyConstant});

var propertyType = indexerProp.PropertyType;
var right = Expression.Constant(Convert.ChangeType("newValue", propertyType ));
var expression = Expression.MakeBinary(ExpressionType.Equal, dictAccess, right);

索引器的属性名总是“Item”。 dictKeyConstant 应该是字典键的表达式。

关于特定字典项的 C# MemberExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42020873/

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