2010-06-01 78 views
4

这里是我所拥有的。查找类型给定的通用基类型和实施类型

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的>所有类型的列表。

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 

如果:你想测试

感谢

回答

5

如果你的类型(称为types)的列表,你可以使用IsAssignableFrom方法获取从指定的基类继承的所有类型您对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(); 

遗憾的是,没有办法“魔术”般地找到某种类型的这样的 - 你需要搜索所有可用的类型,这可能是一个相当昂贵的操作。但是,如果您只需要进行一次这样的操作(例如,应用程序启动时),则应该没问题。

+0

谢谢。我正在检查typeof(BaseClass <>)并忘记添加MakeGenericType调用。 – 2010-06-01 16:23:10