gpt4 book ai didi

c# typeof 应用于泛型参数父类(super class)型

转载 作者:太空狗 更新时间:2023-10-30 00:49:03 24 4
gpt4 key购买 nike

我有一个方法,它没有任何 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(整数列表)将返回“错误:从未调用”。

实际输出:“方法只适用于 int 列表”

这在 Java 中运行得非常好。你会说 c# 中的泛型不支持这个。如何重构我的代码以使“ToString(object)”方法适用于对象列表?

要求:您不能修改方法的签名,只能修改其实现。

不幸的是你不能让“int”类实现一个接口(interface)。由于 int 类是由 Microsoft 编写的。因此,我无法在 int 类型上添加访问者模式。

最佳答案

Unfortunately, c# typeof operator doesn't work on generics as shown bellow.

实际上,它并没有像您期望的那样工作,这是相当幸运的。与 Java 不同,C# 区分 List<int>List<object>在运行时,不仅在编译时。使用原始类型参数实例化的泛型的类型信息让 .NET 通过避免类型删除来生成更高效的代码。

如果您想测试一个对象是否是任何通用列表,请改用此检查:

var objT = obj.GetType();
if (objT.IsGenericType && objT.GetGenericTypeDefinition() == typeof(List<>)) {
...
}

As such I cannot add a visitor pattern on int type.

C# 为您提供了一种无需实现接口(interface)即可动态分派(dispatch)的强大机制。例如,您可以这样做:

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的正确实现基于列表中对象的运行时类型。

关于c# typeof 应用于泛型参数父类(super class)型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41073490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com