我有一个类型为Expression<Func<T,bool>>
的属性的类,我想用"m => m.A + m.B = m.C"
之类的字符串设置此属性。
如果我将其写为新Type<T>(){propertyName = m => m.A + m.B = m.C}
,则将此属性设置为true
返回。
我希望能够做到这一点:
string s = "m => m.A + m.B = m.C";
Type<T> t = new Type<T>(){propertyName = s}
if(t.propertyName){//do something}
我有一组代表这些匿名方法的字符串,并希望根据可选标准动态测试这些方法。
答案 0 :(得分:0)
以下链接包含有关动态linq查询的信息。也许对他们的DLL的反思可能有所帮助。 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
最终,您需要在System.Linq.Expressions.Expression上使用静态工厂方法来构建表达式。
我在这里做了两个假设:
这是一个测试类来说明我的例子:
public class TestClass
{
public string A { get; set; }
public string B { get; set; }
}
这是一个静态类和方法,它将构建lambda表达式,转换为Expression&lt; Func&lt; TestClass,string&gt;&gt ;,然后将其编译为Func&lt; TestClass,string&gt;您可以像任何方法调用一样运行。
public static class TestHelper
{
public static string GetString()
{
var testObject = new TestClass { A = "Hey", B = "Man" }; //Replace TestClass
var type = testObject.GetType();
var parameter = Expression.Parameter(type, "m");
var property1 = Expression.Property(parameter, "A");
var property2 = Expression.Property(parameter, "B");
MethodInfo mi = typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) });
var concat = Expression.Call(mi, property1, property2);
var lambda = Expression.Lambda<Func<TestClass, string>>(concat, parameter); //Replace TestClass
var newFunction = lambda.Compile();
string s = newFunction(testObject); //Replace TestClass
}
}