gpt4 book ai didi

c# - 获取泛型类的子类型列表

转载 作者:行者123 更新时间:2023-11-30 14:52:04 40 4
gpt4 key购买 nike

我有一个包含许多子类型的泛型类:

public abstract class MyClass<T> : MyBaseClass where T : class
{...}

public class MySubClassA : MyClass<A>
{...}

public class MySubClassB : MyClass<B>
{...}

有没有一种简单的方法可以搜索 MyClass 的子类并获得 IEnumerable<Type>包含 MySubClassA 和 MySubClassB?

我以前用过这个方法,但我不确定如何调整它以用于泛型:

public static IEnumerable<Type> GetSubTypesOf(Type t, bool baseAssemblyOnly = false)
{
List<Type> types = new List<Type>();
Assembly[] searchAssemblies = baseAssemblyOnly
? new[] { Assembly.GetAssembly(t) }
: AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly a in searchAssemblies)
{
types.AddRange(a.GetTypes()
.Where(myType => myType.IsClass
&& !myType.IsAbstract
&& myType.IsSubclassOf(t)));
}
return types;
}

最佳答案

这有点复杂,因为您必须搜索类型的基类型才能找到与 MyClass<> 的开放通用类型定义相匹配的类型。 .您可以定义几个辅助方法:

public static IEnumerable<Type> BaseTypesOf(Type t)
{
while (t != null)
{
yield return t;
t = t.BaseType;
}
}

public static Type FindGenericBaseTypeOf(Type t, Type openType)
{
return BaseTypesOf(t)
.FirstOrDefault(bt => bt.IsGenericType && bt.GetGenericTypeDefinition() == openType);
}

然后您可以将它们应用于传入的类型序列以进行搜索,例如

var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && !t.IsAbstract)
.Select(t => new { Type = t, GenericBase = FindGenericBaseTypeOf(t, typeof(MyClass<>)) })
.Where(ts => ts.GenericBase != null)
.Select(ts => ts.GenericBase.GetGenericArguments().First())
.ToArray();

关于c# - 获取泛型类的子类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32595044/

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