我正在重新考虑一些使用以下构造的代码。我希望能够做到这一点,所以我可以在Func中使用其他参数类型。
IDictionary<string, Func<Employee, string>>
我尝试使用:
IDictionary<string, Func<Object, string>>
然后再把它扔掉:
(IDictionary<string, Func<Object, string>>)myDictionary
但我得到一个例外,说我无法施放
无法转换类型为System.Collections.Generic.Dictionary
2[System.String,System.Func
的对象2 ...
我一直在玩仿制药,但这似乎只是让我觉得我无法在课堂上设置和通用字段
private IDictionary<string, Func<T, string>> lineSpecification;
一直在四处走动,所以任何指针都会受到赞赏。
编辑:
这是我收到的完整异常消息:
System.InvalidCastException : Unable to cast object of type 'System.Collections.Generic.Dictionary`2[System.String,System.Func`2[DataObjects.Employee,System.String]]' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.
答案 0 :(得分:5)
这不是类型安全的。
如果这是合法的,如果您将Car
传递给其中一个已投放的值(实际上是Func<Employee, string>
)会怎样?
答案 1 :(得分:2)
而是将词典键入为
IDictionary<string, object>
并投出结果值:
IDictionary<string, object> myDictionary = new Dictionary<string, object>();
var myDelegate = (Func<Employee, string>)myDictionary["my employee delegate"];
当然,如果您尝试转换错误的Func类型,这将失败,因此您应该确定知道哪些键映射到哪些Func类型。
答案 2 :(得分:0)
听起来你希望你的字典具有不同类型的值;换句话说,单个词典可能包含Func<Employee, string>
和Func<Customer, string>
。
如果是这样,那么你基本上别无选择,只能为TValue
类型参数使用公共基类型,并在从字典中检索它们时强制转换委托。常见的基本类型可以是System.Delegate
或System.Object
。
(实际上除此之外还有其他选择,但是他们只是将转换推到设计的不同部分。例如,你可以编写一个包装类来处理你的转换。这样的解决方案通常不会不过,我们可以进行成本效益分析。)
我的词典只会保持相同的类型,但在不同的场景中,我希望它能够容纳不同的类型。我遇到的问题是从Func转换为Func会引发转换异常。
在这种情况下,您不清楚为什么要拥有Dictionary<string, Func<Object, string>>
而不是Dictionary<string, Func<Employee, string>>
。如果任何给定的字典只包含一种类型的委托,则相应地创建字典:
Dictionary<string, Func<Employee, string>> dict = new Dictionary<string, Func<Employee, string>>();
如果字典是泛型类的成员,或泛型方法的局部变量或参数,则可以在字典的声明中使用类型参数:
class Processor<T>
{
void Process(T value, Dictionary<string, Func<T, string>> functions) { //... }
}