2015-12-17 1 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>"); 
} 

п вы можете использовать:

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

Обратите внимание, что если у вас есть класс:

public class Foo<T> : Database<T> 

... тогда вы будете в конечном итоге получить Type ссылку, представляющую T в Foo<T>. Избавиться от этого для типа с базовым типом Foo<string>, например, было бы сложно. Надеюсь, вы не в такой ситуации ...

 Смежные вопросы

  • Нет связанных вопросов^_^