c# typeof applied to generic parameter supertype
我有一个方法,它没有任何t参数。
不幸的是,C类型的运算符不适用于下面所示的泛型。
1 2 3 4 5 6 7 8 9 10 11 12 |
预期的输出:toString(int列表)将返回"bug:never called"。
实际输出:"方法仅适用于int列表"
这在Java中运行得非常好。你会说C中的仿制药不支持这一点。如何重新构造代码,使"ToString(object)"方法适用于对象列表?
要求:不能修改方法的签名,只能修改其实现。
不幸的是,您不能使"int"类实现接口。因为int类是由Microsoft编写的。因此,我不能在int类型上添加访问者模式。
Unfortunately, c# typeof operator doesn't work on generics as shown bellow.
事实上,很幸运它没有像你期望的那样工作。与Java不同,C在运行时区分EDCOX1 0和EDCOX1 1,不仅在编译时。用基元类型参数实例化的泛型的类型信息使.NET通过避免类型擦除来生成更高效的代码。
如果要测试对象是否为任何通用列表,请使用此检查:
1 2 3 4 | var objT = obj.GetType(); if (objT.IsGenericType && objT.GetGenericTypeDefinition() == typeof(List<>)) { ... } |
As such I cannot add a visitor pattern on
int type.
C为您提供了一种强大的动态调度机制,无需实现接口。例如,可以这样做:
1 2 3 4 5 6 7 8 9 10 11 | public static string ToString(object obj) { var list = obj as IList; if (list != null) { foreach (dynamic o in list) { Process(o); } } } static void Process(int n) { ... } static void Process(string s) { ... } static void Process(object o) { ... } |
上面将根据列表中对象的运行时类型选择正确的