【发布时间】:2017-05-19 14:44:40
【问题描述】:
不知道怎么表达清楚。
我有这个界面:
interface IConverter
{
Dictionary<Type, Func<string, object>> ConversionMethods { get; }
}
基本上,它定义了一个约定,说明实现它的类应该为它使用的所有自定义类型(无论是枚举还是任何东西)提供转换方法。
是否可以将Func 的泛型类型中的object 替换为其对应的字典键的类型(因此不可能有两个不匹配的类型)?
我认为这是不可能的,但替代方案有点烦人(使用dynamic 或object,创建一个专门的字典......)。
编辑 1:想象的使用示例
interface IConverter
{
Dictionary<Type, Func<string, object>> GetConversionMethods();
}
enum A
{
AA,AB,AC
}
enum B
{
BA, BB, BC
}
class blah : IConverter
{
public Dictionary<Type, Func<string, object>> GetConversionMethods()
{
var d = new Dictionary<Type, Func<string, object>>
{
{
typeof(A),
(s) =>
{
// here, I could return whatever I want because the 'Func' returns 'object'
return s == "AA" ? A.AA : s == "AB" ? A.AB : A.AC;
}
},
{
typeof(B),
(s) =>
{
// same
return s == "BA" ? B.BA : s == "BB" ? B.BB : B.BC;
}
}
};
return d;
}
void blahah()
{
// and here, I also get an `object`, where I would like to have a A
GetConversionMethods()[typeof(A)]("123");
}
}
【问题讨论】:
-
如果可能的话,您能否发布一个示例代码 sn-p,说明您打算如何访问这样一个虚构的字典?
-
@Kilazur,“是否可以在 Func 的泛型类型中替换 Type”...你的意思是替换
object? -
编译时不可能。
-
到目前为止发布的示例显示了您将如何填写字典。但是在该代码中,使用
object或dynamic键入函数还不会像您说的那样“烦人”,对吗?我想一旦你尝试从字典中阅读,当你必须投射时,烦人的部分就会随之而来——你能举一个这种用法的例子吗?具体来说,我想知道您是否会知道在编译时检索的类型(在这种情况下,您可能不需要字典),或者是否只在运行时知道(在这种情况下,我无法想象您如何安全地使用结果类型) . -
这与我之前尝试过的东西有关。你可以靠近,但不能通过这条路线。基本上,可以使用泛型来强制执行您所追求的要求,但不能仅使用现有类型;您将需要一些自定义类型。我会看看我是否可以提炼出一个可以作为答案的例子。
标签: c# dictionary generics func