动态功能映射
本文关键字:映射 功能 动态 | 更新日期: 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);
}
我不喜欢的是,在字典中有一个对象值类型,但我不确定如何避免它。