有没有人听说过使用类型作为键并支持继承的"类型字典"?
在我的应用程序中,我想要一个从类型到函数的字典,有点像这样:
Dictionary<Type, Func<object, object>> Transformers;
Run Code Online (Sandbox Code Playgroud)
这个想法是它将用于根据类型以某种方式转换对象:
// Transform an object 'obj'
object result = Transformers[obj.GetType()](obj)
Run Code Online (Sandbox Code Playgroud)
普通字典的缺点是类型必须完全匹配.因此,如果我为IList <T>编写了一个变换器,那么将它放在Transformers字典中是没有用的,因为没有对象具有IList <T>类型(只有T [],List <T>等).换句话说,如果obj是List <T>,则普通字典中的查找将找不到IList <T>的变换器.
假设没有TypeDictionary <TValue>这样的东西,如果不是太难,我可以考虑写一个.有什么想法可以实现吗?
您应该能够使用带有自定义比较器的字典,该比较器使用Type.IsAssignableFrom来比较键。
更新:正如 Qwertie 指出的那样,这不起作用,因为您无法基于类型、其接口和祖先类实现可重复的哈希码计算。他的答案提供了一个可能的解决方案,通过重复对类型、接口和祖先类进行哈希表查找,直到找到匹配项。
该解决方案的唯一问题是,当存在多个匹配项时,您没有任何方法来指定要采用哪个匹配项。如果您需要这种灵活性和控制力,我建议您考虑责任链设计模式。每个变压器都可以是链中的一个环节,它负责确定它是否可以应用于对象。如果没有,它将请求传递到下一个链接。链中变压器的顺序决定了优先级。你会失去哈希表的速度,但由于多次查找,你无论如何都会失去一些速度。