gpt4 book ai didi

c# - 如何检测一个对象是一个泛型集合,以及它包含哪些类型?

转载 作者:行者123 更新时间:2023-11-30 13:05:28 25 4
gpt4 key购买 nike

我有一个字符串序列化实用程序,它接受(几乎)任何类型的变量并将其转换为字符串。因此,例如,根据我的约定,整数值 123 将被序列化为“i:3:123”(i=整数;3=字符串长度;123=值)。

该实用程序处理所有基本类型,以及一些非泛型集合,如 ArrayLists 和 Hashtables。接口(interface)形式为

public static string StringSerialize(object o) {}

我在内部检测对象的类型并相应地对其进行序列化。

现在我想升级我的实用程序来处理通用集合。有趣的是,我找不到合适的函数来检测该对象是一个通用集合,以及它包含什么类型——我需要这两条信息才能正确序列化它。到目前为止,我一直在使用

形式的编码

if (o is int) {// do something}

但这似乎不适用于泛型。

你有什么建议?


编辑:感谢 Lucero ,我已经接近答案了,但我在这里遇到了这个小语法难题:

if (t.IsGenericType) {
if (typeof(List<>) == t.GetGenericTypeDefinition()) {
Type lt = t.GetGenericArguments()[0];
List<lt> x = (List<lt>)o;
stringifyList(x);
}
}

此代码无法编译,因为“lt”不允许作为<T> List<> 的参数目的。为什么不?什么是正确的语法?

最佳答案

使用类型收集所需信息。

对于通用对象,调用 GetType() 获取它们的类型,然后检查 IsGenericType找出它是否是通用的。如果是,您可以获得通用类型定义,可以像这样进行比较:typeof(List<>)==yourType.GetGenericTypeDefinition() .要找出泛型类型是什么,请使用方法 GetGenericArguments ,它将返回所用类型的数组。

要比较类型,您可以执行以下操作:if (typeof(int).IsAssignableFrom(yourGenericTypeArgument)) .


编辑以回答后续问题:

只需制作您的 stringifyList方法接受 IEnumerable (不是泛型)作为参数,也可能是已知的泛型类型参数,你会没事的;然后你可以使用 foreach遍历所有项目并在必要时根据类型参数处理它们。

关于c# - 如何检测一个对象是一个泛型集合,以及它包含哪些类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769634/

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