铸造系统.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]'.
这不是类型安全的。
如果这是合法的,如果您将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.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) { //... }
}