铸造系统.Func<;T>;

本文关键字:gt lt Func 系统 | 更新日期: 2023-09-27 18:28:20

我正在重新分解一些使用以下构造的代码。我想做的是使其通用,这样我就可以在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]'.

铸造系统.Func<;T>;

这不是类型安全的。

如果这是合法的,如果您将Car传递给其中一个强制值(实际上是Func<Employee, string>),会发生什么?

相反,键入Dictionary作为IDictionary<string, object>并铸造结果值:

IDictionary<string, object> myDictionary = new Dictionary<string, object>();
var myDelegate = (Func<Employee, string>)myDictionary["my employee delegate"];

当然,如果您尝试强制转换错误的Func类型,这将失败,所以您应该确保知道哪些键映射到哪些Func类型。

听起来您希望您的字典具有不同类型的值;换句话说,单个字典可能包含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) { //... }
}