Как сделать универсальную лямбду с помощью MakeGenericType - PullRequest
0 голосов
/ 08 марта 2019

ниже - мой фрагмент кода

        List<int> list = new List<int>() { 1, 2, 3, 4, 5 };

        Func<int, bool> f = c => c > 3;
        var result = list.Where(f);
        Console.WriteLine(result.ToList());

        var param = Expression.Parameter(typeof(int),"c");
        var constant = Expression.Constant(3);
        var body = Expression.GreaterThanOrEqual(param, constant);
        var funcType = typeof(Func<,>).MakeGenericType( typeof(int), typeof(bool));
        var funcDelegate = Expression.Lambda(funcType, body, param);
        result = list.Where(funcDelegate);

        Console.WriteLine(result.ToList());

        Console.ReadLine();

Система сказала мне result = list.Where(funcDelegate); неверно, не может преобразовать "System.Linq.Expressions.LambdaExpression" to "System.Func<int,int,bool>"

Я думаю, что должен допустить ошибку при использовании метода MakeGenericType,Как я могу построить правильное универсальное лямбда-выражение с помощью MakeGenericType?

спасибо!

1 Ответ

1 голос
/ 08 марта 2019

Вы можете использовать

var funcDelegate = Expression.Lambda<Func<int,bool>>(body, param).Compile();

вместо

var funcType = typeof(Func<,>).MakeGenericType( typeof(int), typeof(bool));
var funcDelegate = Expression.Lambda(funcType, body, param);

Таким образом, вам не нужно будет разыгрывать делегата.

(Не забывайте Compile() часть)

...