c# typeof 应用于泛型参数超类型
c# typeof applied to generic parameter supertype
我有一个方法,它没有任何 T 参数。
不幸的是,C# typeof 运算符不适用于泛型,如下所示。
public static string ToString(object obj)
{
if (obj.GetType() == typeof(List<object>))
{
return "Bug: Never called";
}
if (obj.GetType() == typeof(List<int>))
{
return "Method only works for int lists";
}
return "";
}
预期输出:ToString(整数列表)将 return "Bug: Never Called".
实际输出:"Method only works for int lists"
这在 Java 中运行得非常好。你会说 c# 中的泛型不支持这个。如何重构我的代码以使 "ToString(object)" 方法适用于对象列表?
要求:您不能修改方法的签名,只能修改其实现。
不幸的是,您无法使 "int" class 实现接口。由于 int class 是由微软编写的。因此,我无法在 int 类型上添加访问者模式。
Unfortunately, c# typeof operator doesn't work on generics as shown bellow.
实际上,它没有像您期望的那样工作,这已经很幸运了。与 Java 不同,C# 在 运行 时区分 List<int>
和 List<object>
,而不仅仅是在编译时。使用原始类型参数实例化的泛型的类型信息让 .NET 通过避免类型擦除来生成更高效的代码。
如果您想测试对象是否是 any 通用列表,请改用此检查:
var objT = obj.GetType();
if (objT.IsGenericType && objT.GetGenericTypeDefinition() == typeof(List<>)) {
...
}
As such I cannot add a visitor pattern on int
type.
C# 为您提供了一种无需实现接口即可动态分派的强大机制。例如,您可以这样做:
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) { ... }
以上将根据列表中对象的 运行 时间类型选择 Process
的正确实现。
我有一个方法,它没有任何 T 参数。
不幸的是,C# typeof 运算符不适用于泛型,如下所示。
public static string ToString(object obj)
{
if (obj.GetType() == typeof(List<object>))
{
return "Bug: Never called";
}
if (obj.GetType() == typeof(List<int>))
{
return "Method only works for int lists";
}
return "";
}
预期输出:ToString(整数列表)将 return "Bug: Never Called".
实际输出:"Method only works for int lists"
这在 Java 中运行得非常好。你会说 c# 中的泛型不支持这个。如何重构我的代码以使 "ToString(object)" 方法适用于对象列表?
要求:您不能修改方法的签名,只能修改其实现。
不幸的是,您无法使 "int" class 实现接口。由于 int class 是由微软编写的。因此,我无法在 int 类型上添加访问者模式。
Unfortunately, c# typeof operator doesn't work on generics as shown bellow.
实际上,它没有像您期望的那样工作,这已经很幸运了。与 Java 不同,C# 在 运行 时区分 List<int>
和 List<object>
,而不仅仅是在编译时。使用原始类型参数实例化的泛型的类型信息让 .NET 通过避免类型擦除来生成更高效的代码。
如果您想测试对象是否是 any 通用列表,请改用此检查:
var objT = obj.GetType();
if (objT.IsGenericType && objT.GetGenericTypeDefinition() == typeof(List<>)) {
...
}
As such I cannot add a visitor pattern on
int
type.
C# 为您提供了一种无需实现接口即可动态分派的强大机制。例如,您可以这样做:
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) { ... }
以上将根据列表中对象的 运行 时间类型选择 Process
的正确实现。