动态函数映射

Mik*_*keb 4 c# generics functional-programming

我想定义以下两个函数:

void Map<T>(Func<T, string> mapper);

T Call<T>(string value);
Run Code Online (Sandbox Code Playgroud)

Map需要存储将字符串转换为类型T的结果的函数,以便在使用类型T和字符串调用"调用"函数时,可以查找并调用相应的函数.

我在想地图可以将函数存储在类型字典中Dictionary<Type, Func<object, string>>,然后调用可以将类型转换为适当的类型,但我无法使其工作.有谁知道如何实现这一目标?

Jer*_*Gee 5

第一个类型的参数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);
    }
Run Code Online (Sandbox Code Playgroud)