powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вызов метода Enumerable.Max через Expression.Call
2 сообщений из 2, страница 1 из 1
Вызов метода Enumerable.Max через Expression.Call
    #39360773
Max_Tpop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно вызвать метод Enumerable.Max через Expression.Call?

Пытаюсь так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class MyData
{
    public int ID { get; set; }
    public int Code { get; set; }
    public int Value { get; set; }
}

// Generate Method
Type enumerableType = typeof(Enumerable);
MethodInfo methodInfo = enumerableType.GetMethods().Where(a => a.Name == "Max" && a.IsGenericMethod && a.ReturnType.IsGenericParameter && a.ReturnType.Name == "TResult").FirstOrDefault();
Type TSource = methodInfo.GetGenericArguments()[0];
Type TResult = methodInfo.GetGenericArguments()[1];
Type[] types = { typeof(IEnumerable<>).MakeGenericType(TSource), typeof(Func<,>).MakeGenericType(TSource, TResult) };
MethodInfo method = enumerableType.GetMethod("Max", types);

// Call Method
ParameterExpression parameter =  Expression.Parameter(typeof(MyData), "a");
PropertyInfo property = typeof(MyData).GetProperty("Value");
MemberExpression memberAccess = Expression.MakeMemberAccess(parameter, property);
Expression func = Expression.Lambda<Func<MyData, int>>(memberAccess, parameter);
MethodCallExpression call = Expression.Call(null, method, new Expression[] { parameter, func });
...
Рейтинг: 0 / 0
Вызов метода Enumerable.Max через Expression.Call
    #39393912
ntkrnlmp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Max_Tpop,

Я не буду спрашивать зачем вам это понадобилось:)

Для начала необходимо создать метод, содержащий конкретные типы, а не обобщения:

Код: c#
1.
2.
MethodInfo method = enumerableType.GetMethod("Max", types);
method = method.MakeGenericMethod(typeof(MyData), typeof(int));



Далее вы пытаетесь создать выражение вызова метода с параметрами типа MyData и Func<MyData, int>. При этом вы пытаетесь вызвать метод, который принимает IEnumerable<T> и Func<T, TResult>.

Код: c#
1.
2.
3.
4.
5.
6.
// Call Method
ParameterExpression parameter = Expression.Parameter(typeof(MyData), "a");                        // a
PropertyInfo property = typeof(MyData).GetProperty("Value");                        
MemberExpression memberAccess = Expression.MakeMemberAccess(parameter, property);                 // a.Value
Expression func = Expression.Lambda<Func<MyData, int>>(memberAccess, parameter);                  // a => a.Value
MethodCallExpression call = Expression.Call(null, method, new Expression[] { parameter, func });  // вызов Enumerable.Max(a, a => a.Value)



Вам нужен еще один параметр - коллекция IEnumerable<MyData>, в которой, собственно, будет выполнятся подсчет максимального элемента.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ParameterExpression parameter = Expression.Parameter(typeof(MyData), "a");
PropertyInfo property = typeof(MyData).GetProperty("Value");
MemberExpression memberAccess = Expression.MakeMemberAccess(parameter, property);
LambdaExpression func = Expression.Lambda<Func<MyData, int>>(memberAccess, parameter);

ParameterExpression collectionParameter = Expression.Parameter(typeof(IEnumerable<MyData>));
ParameterExpression lambdaParameter = Expression.Parameter(typeof(Func<MyData, int>));
MethodCallExpression call = Expression.Call(null, method, new Expression[] { collectionParameter, func });

Func<MyData, int> selector = x => x.Value;
var result = Expression.Lambda(call, collectionParameter, lambdaParameter).Compile().DynamicInvoke(collection, selector);
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вызов метода Enumerable.Max через Expression.Call
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]