Обновление: Спасибо всем коллегам и их комментариям. Заменен мой первоначальный ответ.
Первое, что вам абсолютно не нужно Expression
, чтобы сделать эту работу, потому что нижняя строка - это локатор типа с завихрением. Взгляните на следующую реализацию:
public class FuncMapper
{
Dictionary<Type, Delegate> _funcs = new Dictionary<Type, Delegate>();
public void Register<TIn, TOut>(Func<TIn, TOut> func)
{
_funcs.Add(func.GetType(), func);
}
public TOut Execute<TIn, TOut>(TIn param)
{
return ((Func<TIn, TOut>)_funcs[typeof(Func<TIn, TOut>)])(param);
}
}
Затем, используя это просто:
class Program
{
static void Main(string[] args)
{
FuncMapper funcMapper = new FuncMapper();
funcMapper.Register<string, string>(DoString);
funcMapper.Register<int, int>(DoInt);
Console.WriteLine("Value: {0}", funcMapper.Execute<string, string>("Test"));
Console.WriteLine("Value: {0}", funcMapper.Execute<int, int>(10));
Console.Read();
}
static string DoString(string param)
{
return param;
}
static int DoInt(int param)
{
return param;
}
}
Update2: Если вам действительно нужно выражение для какой-либо причине, вы можете изменить Register
метод следующим образом:
public void Register<TIn, TOut>(Expression<Func<TIn, TOut>> expression)
{
Func<TIn, TOut> func = expression.Compile();
_funcs.Add(func.GetType(), func);
}
А потом называют это так:
funcMapper.Register<string, string>((param) => DoString(param));
funcMapper.Register<int, int>((param) => DoInt(param));
'Список>' это опечатка? –
Если переменные InType и OutType различаются, вам может потребоваться пересмотреть, если вы должны оставить их в том же списке. Else, возможно, InType и OutType могут иметь один и тот же базовый класс или реализовать общий интерфейс. – marsze
Почему бы не объявить список как 'List'? Затем вы также можете получить параметры (т. Е. Тип InType) и возвращаемый тип (т. Е. OutType) программно –
bassfader