如何将表示Lambda表达式的字符串强制转换为System.LINQ.Expressions.Expression

时间:2010-05-19 19:23:33

标签: lambda c#-4.0

我有一个类型为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}

我有一组代表这些匿名方法的字符串,并希望根据可选标准动态测试这些方法。

1 个答案:

答案 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上使用静态工厂方法来构建表达式。

我在这里做了两个假设:

  • 你真的想要字符串s = m.A + m.B
  • A和B都是属性而不是字段

这是一个测试类来说明我的例子:

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
    }
}