这是我的。
BaseClass<T>
{
}
MyClass
{
}
NewClass : BaseClass<MyClass>
{
}
我需要查看是否有一个类使用 MyClass 的特定泛型实现来实现 BaseClass,并获取该类的类型。在这种情况下,它将是 NewClass
编辑
AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(
typeof(BaseClass<>).MakeGenericType(typeof(MyClass)).IsAssignableFrom);
这将返回实现 BaseClass< MyClass > 的所有类型的列表。
谢谢
如果您有要测试的类型列表(称为 types
),您可以使用 IsAssignableFrom
方法获取从指定基类继承的所有类型:
var baseType = typeof(BaseClass<MyClass>);
var info = types.Where(t => baseType.IsAssignableFrom(t)).FirstOrDefault();
if (info != null)
// We have some type 'info' which matches your requirements
如果您只有关于 MyClass
类型的运行时信息,那么您可以像这样获取 baseType
:
Type myClassInfo = // get runtime info about MyClass
var baseTypeGeneric = typeof(BaseClass<>);
var baseType = baseTypeGeneric.MakeGenericType(myClassInfo);
您写道您需要以某种方式找到类,所以最后一个问题是如何获取列表 types
。为此,您需要搜索一些程序集 - 您可以从当前正在执行的程序集(如果该类型在您的应用程序中)或一些由名称标识的知名程序集开始。
// Get all types from the currently running assembly
var types = Assembly.GetExecutingAssembly().GetTypes();
不幸的是,没有办法“神奇地”找到这样的类型——您需要搜索所有可用的类型,这可能是一项非常昂贵的操作。但是,如果您只需要执行一次(例如,在应用程序启动时),您应该没问题。