2015-12-17 72 views
0

我有具有從另一抽象類的類型參數的基抽象類,如:得到一個類的類型參數,通過了解只有類的類型

public abstract class Database<T> where T : DatabaseItem, new() { //... } 

public abstract class DatabaseItem { //... } 

然後我有孩子類固有的數從中:

public class ShopDatabase : Database<ShopItem> {} 
public class ShopItem : DatabaseItem {} 

public class WeaponDatabase : Database<WeaponItem> {} 
public class WeaponItem : DatabaseItem {} 

//... 

現在的問題是,我有類型作爲數據庫數組:

private static readonly Type[] DATABASE_TYPES = new Type[] { 
    typeof (ShopDatabase), 
    typeof (WeaponDatabase) 
}; 

,我想所有的類型參數,另一個數組,這樣的:

Type[] databaseItemTypes = MyFunction (DATABASE_TYPES); 
// databaseItemTypes will be an array as: [ShopDatabaseItem, WeaponDatabaseItem] 

這可能與此類似question,但我甚至不具備類的實例,因此。 ..

回答

2

如果你正在尋找的類型參數爲一個特定的類,這是相對容易:

static Type GetDatabaseTypeArgument(Type type) 
{ 
    for (Type current = type; current != null; current = current.BaseType) 
    { 
     if (current.IsGenericType && current.GetGenericTypeDefinition() == typeof(Database<>)) 
     { 
      return current.GetGenericTypeArguments()[0]; 
     } 
    } 
    throw new ArgumentException("Type incompatible with Database<T>"); 
} 

的n您可以使用:

Type[] databaseItemTypes = DatabaseTypes.Select(GetDatabaseTypeArgument).ToArray(); 

需要注意的是,如果你有一類:

public class Foo<T> : Database<T> 

...那麼你將最終獲得代表Foo<T>T一個Type參考。例如,基礎類型爲Foo<string>的類型擺脫困難。希望你不是在這種情況下......