查找给定通用基类型和实现类型的类型

时间:2010-06-01 16:12:21

标签: c# .net reflection

这就是我所拥有的。

BaseClass<T>
{
}

MyClass
{
}

NewClass : BaseClass<MyClass>
{
}

我需要查看是否有一个类使用MyClass的特定泛型实现来实现BaseClass并获取该类的类型。在这种情况下,它将是NewClass

修改

AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(
typeof(BaseClass<>).MakeGenericType(typeof(MyClass)).IsAssignableFrom);

这将返回实现BaseClass&lt;的所有类型的列表。 MyClass&gt;。

由于

1 个答案:

答案 0 :(得分:5)

如果您有要测试的类型列表(称为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();

不幸的是,没有办法“神奇地”找到这样的类型 - 你需要搜索所有可用的类型,这可能是相当昂贵的操作。但是,如果您只需要执行一次此操作(例如,当应用程序启动时),您应该没问题。