gpt4 book ai didi

c# - 如何通过反射获取集合中包含的类型

转载 作者:可可西里 更新时间:2023-11-01 08:35:29 25 4
gpt4 key购买 nike

在我的代码的某些部分,我传递了一个T 类型的对象集合。我不知道我将通过哪个具体集合,除了它实现 IEnumerable

在运行时,我需要找出 T 是哪种类型(例如 System.DoubleSystem.String 等...)。

有什么办法可以查出来吗?

更新:我或许应该更清楚地说明我工作的环境(Linq 提供程序)。

我的函数有一个像下面这样的签名,我在其中获取集合的类型作为参数:

string GetSymbolForType(Type collectionType)
{

}

有什么方法可以从collectionType 获取包含的对象类型吗?

最佳答案

来自 Matt Warren's Blog :

internal static class TypeSystem {
internal static Type GetElementType(Type seqType) {
Type ienum = FindIEnumerable(seqType);
if (ienum == null) return seqType;
return ienum.GetGenericArguments()[0];
}
private static Type FindIEnumerable(Type seqType) {
if (seqType == null || seqType == typeof(string))
return null;
if (seqType.IsArray)
return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());
if (seqType.IsGenericType) {
foreach (Type arg in seqType.GetGenericArguments()) {
Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);
if (ienum.IsAssignableFrom(seqType)) {
return ienum;
}
}
}
Type[] ifaces = seqType.GetInterfaces();
if (ifaces != null && ifaces.Length > 0) {
foreach (Type iface in ifaces) {
Type ienum = FindIEnumerable(iface);
if (ienum != null) return ienum;
}
}
if (seqType.BaseType != null && seqType.BaseType != typeof(object)) {
return FindIEnumerable(seqType.BaseType);
}
return null;
}
}

关于c# - 如何通过反射获取集合中包含的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900353/

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