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