动态功能映射

本文关键字:映射 功能 动态 | 更新日期: 2023-09-27 18:18:44

我想定义以下两个函数:

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

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

我认为映射可以将函数存储在类型Dictionary<Type, Func<object, string>>的字典中,然后调用可以将其转换为适当的类型,但我无法使其工作。有人知道如何做到这一点吗?

动态功能映射

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);
    }

您可以尝试这样做(应该有更好的方法,但我现在看不到):

Dictinary<Type, object> _funcDict = ...;
void Map<T>(Func<T, string>mapper)
{
    _funcDict[typeof(T)] = mapper;
}
T Call<T>(string value)
{
    var func = (Func<T, string>)_funcDict[typeof(T)]
    return func(value);
}

我不喜欢的是,在字典中有一个对象值类型,但我不确定如何避免它。