转换System.Func <t> </t>

时间:2012-03-20 19:09:53

标签: c# generics func

我正在重新考虑一些使用以下构造的代码。我希望能够做到这一点,所以我可以在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]'.

3 个答案:

答案 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.DelegateSystem.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) { //... }
}