2010-06-01 25 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