Первый аргумент типа Func
- это вход , второй выход: Func<in T, out TResult>
- вам нужно Func<string, T>
.
(ссылка MSDN здесь использует Func<string, string>
справедливый бит, который раздражает.)
Кроме того, словарь не может использовать аргумент типа T
, поскольку он отличается для каждого элемента в словаре. Вместо этого используйте суперкласс Func<T, TResult>
, который равен Delegate
.
Это должно работать:
Dictionary<Type, Delegate> dictionary = new Dictionary<Type, Delegate>();
public void Map<T>(Func<string, T> mapper)
{
dictionary[typeof(T)] = mapper;
}
public T Call<T>(string value)
{
var func = dictionary[typeof(T)] as Func<string, T>;
return func.Invoke(value);
}