Как преобразовать строку, представляющую лямбда-выражение, в System.LINQ.Expressions.Expression - PullRequest
1 голос
/ 19 мая 2010

У меня есть класс со свойством типа Expression<Func<T,bool>>, и я хочу установить это свойство со строкой типа "m => m.A + m.B = m.C".

Если я напишу это как новый, Type<T>(){propertyName = m => m.A + m.B = m.C} устанавливает это свойство в true return.

Я хочу иметь возможность сделать это:

string s = "m => m.A + m.B = m.C";
Type<T> t = new Type<T>(){propertyName = s}

if(t.propertyName){//do something}

У меня есть коллекция строк, представляющих эти анонимные методы, и я хочу протестировать их динамически на основе выбираемых критериев.

1 Ответ

0 голосов
/ 22 января 2011

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

  • Вы действительно хотите строку s = m.A + m.B
  • A и B оба являются свойствами, а не полями

Вот тестовый класс, иллюстрирующий мой пример:

public class TestClass
{
    public string A { get; set; }
    public string B { get; set; }
}

Вот статический класс и метод, который будет создавать лямбда-выражение, преобразовывать его в Expression >, а затем компилировать его в 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...