Это лучше всего объяснить с помощью кода. У меня есть общий класс, который имеет метод, который возвращает целое число. Вот простая версия для объяснения...
public class Gen<T>
{
public int DoSomething(T instance)
{
// Real code does something more interesting!
return 1;
}
}
Во время выполнения я использую отражение, чтобы обнаружить тип чего-то, а затем хочу создать экземпляр класса Gen для этого конкретного типа. Это достаточно легко и сделано так...
Type fieldType = // This is the type I have discovered
Type genericType = typeof(Gen<>).MakeGenericType(fieldType);
object genericInstance = Activator.CreateInstance(genericType);
Теперь я хочу создать выражение, которое примет в качестве параметра экземпляр типа generic, а затем вызовет метод DoSomething этого типа. Поэтому я хочу, чтобы выражение эффективно выполняло это...
int answer = genericInstance.DoSomething(instance);
... за исключением того, что у меня нет "экземпляра" до некоторой точки позже во время выполнения, а genericInstance - сгенерированный тип, как видно выше. Моя попытка создать Лямбду для этого заключается в следующем...
MethodInfo mi = genericType.GetMethod("DoSomething",
BindingFlags.Instance | BindingFlags.Public);
var p1 = Expression.Parameter(genericType, "generic");
var p2 = Expression.Parameter(fieldType, "instance");
var x = Expression.Lambda<Func<genericType, fieldType, int>>
(Expression.Call(p1, mi, p2),
new[] { p1, p2 }).Compile();
... так что позже я могу назвать это чем-то вроде этого...
int answer = x(genericInstance, instance);
Конечно, вы не можете предоставить Func с параметрами экземпляра, и поэтому я понятия не имею, как параметризовать генерацию Lambda. Любые идеи?