Foo("MyField" == "MyValue")
是,如问题底部所述,是一个常量false
(在编译器上)。你有几个选择这里 - 最简单的当然是做这样的事情:
void Foo(Expression<Func<YourType,bool>> predicate) {...}
与
Foo(x => x.MyField == "MyValue");
然后这里打电话,没有什么剩下要做的;我们已经有了表达。所以,我认为你的意思是“MyField的”只在运行时已知的字符串,在这种情况下:如果道具
void Foo<T>(string fieldName, T value) {
var param = Expression.Parameter(typeof(YourType), "x");
var body = Expression.Equal(
Expression.PropertyOrField(param, fieldName),
Expression.Constant(value, typeof(T))
);
var lambda = Expression.Lambda<Func<YourType, bool>>(body, param);
}
和(在那里有一个隐含的<string>
,编译器提供)与Foo("MyField", "MyValue)
打电话,或Foo("MyField", 123)
是int
(隐式<int>
),
最终的情形是,"MyValue"
也是串唯一已知的在运行时(EMPH:string
) - 在这种情况下,我们需要对它进行解析:
void Foo(string fieldName, string value) {
var param = Expression.Parameter(typeof(YourType), "x");
var prop = Expression.PropertyOrField(param, fieldName);
ConstantExpression @const;
if(prop.Type == typeof(string)) {
@const = Expression.Constant(value, typeof(string));
} else {
object parsed = TypeDescriptor.GetConverter(prop.Type)
.ConvertFromInvariantString(value);
@const = Expression.Constant(parsed, prop.Type);
}
var body = Expression.Equal(prop,@const);
var lambda = Expression.Lambda<Func<YourType, bool>>(body, param);
}
这里的通话总是2个字符串 - 所以Foo("MyField", "123")
即使当int
。
我认为你的“更新”中有一个错误:“Expression.Parameter”的第二个参数就是参数的*逻辑名* - 因此在`field`中传递看起来非常错误。同样,使用不变的文字“Name”作为字段/属性看起来......不太可能。 – 2011-02-01 10:10:58