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

如何将表示Lambda表达式的字符串强制转换为System.LINQ.Expressions.Expression,lambda,c#-4.0,Lambda,C# 4.0,我有一个属性为Expression类型的类,我想用m=>m.a+m.B=m.C这样的字符串来设置这个属性 如果我将其作为新类型写入{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

我有一个属性为Expression类型的类,我想用m=>m.a+m.B=m.C这样的字符串来设置这个属性

如果我将其作为新类型写入{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}

我有一组表示这些匿名方法的字符串,希望根据可选择的条件动态测试这些方法。

以下链接提供了有关动态linq查询的信息。也许反思一下他们的DLL会有所帮助。

最终,您需要使用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表达式,转换为表达式,然后将其编译为Func,您可以像任何方法调用一样运行它

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