如何将表示Lambda表达式的字符串强制转换为System.LINQ.Expressions.Expression
我有一个属性为Expression类型的类,我想用m=>m.a+m.B=m.C这样的字符串来设置这个属性 如果我将其作为新类型写入{propertyName=m=>m.A+m.B=m.C},则将该属性设置为true返回 我希望能够做到这一点:如何将表示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
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
}
}