2010-05-19 4 views
1

У меня есть класс с свойством типа Expression<Func<T,bool>>, и я хочу установить это свойство с строкой, например "m => m.A + m.B = m.C".Как вы производите строку, представляющую выражение Lambda, в System.LINQ.Expressions.Expression

Если я пишу это как новый 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

Следующая ссылка содержит информацию о динамическом запросе 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 для создания выражения.

Я делаю 2 предположения здесь:

  • Вы действительно хотите струны з = мА + тВ
  • А и В оба свойства, а не поля

Вот тестовый класс для иллюстрации мой пример:

Это статический класс и метод, который будет строить лямбда xpression, convert to Expression < Func < TestClass, строка > >, затем скомпилируйте его в Func < TestClass, строку >, которую вы можете запускать так же, как и любой вызов метода.

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 
    } 
} 
Смежные вопросы