2013-02-14 3 views
0

Я определил общий класс MultiSlot<T>.Убедитесь, что объект принадлежит к общему классу

В какой-то момент я хочу проверить, что объект имеет этот тип (т. Е. Типа MultiSlot), но не определенного типа T. В принципе, я хочу, чтобы все объекты MultiSlotl<T> вводили определенный пункт if, независимо от их конкретных T (учитывая, что все они принадлежат к некоторому подклассу T).

Ориентировочный (но не правильный!) Синтаксис будет: if (obj is MultiSlot<>).

Есть ли способ сделать это?

+0

Да, действительно .. Я обыскал его, прежде чем отправил (но, видимо, недостаточно). Извиняюсь! – yannischris

ответ

4

Посмотрите на Check if a class is derived from a generic class:

Короткий ответ:

public static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) 
    { 
     while (toCheck != null && toCheck != typeof(object)) 
     { 

      var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; 
      if (generic == cur) 
       return true; 
      toCheck = toCheck.BaseType; 

     } 
     return false; 
    } 
+0

пожалуйста [cite] (http://stackoverflow.com/a/457708/201088) другой ответ, когда вы копируете/вставляете. –

+0

вы абсолютно правы @Eren Ersönmez ... извините, ошибка исправлена. Я просто не знал, как найти его снова ... и хорошо, мне следовало бы перевести поисковую систему StackOverflow! Мои извинения – Kek

+0

Да, это сработало отлично, много! – yannischris

0

Вы можете использовать метод Type.GetGenericTypeDefinition(), как это:

public bool IsMultiSlot(object entity) 
{ 
    Type type = entity.GetType(); 
    if (!type.IsGenericType) 
    return false; 
    if (type.GetGenericTypeDefinition() == typeof(MultiSlot<>)) 
    return true; 
    return false; 
} 

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

var listOfPotentialMultiSlots = ...; 
var multiSlots = listOfPotentialMultiSlots.Where(e => e.IsMultiSlot()); 

Обратите внимание, что это возвращает false для экземпляра подкласса (т. StringMultiSlot : MultiSlot<string>)

+0

Я полагаю, что добавление цикла «while» (в первом ответе) заставляет код работать для подклассов. Thnx! – yannischris

0

не столь сложный подход:

var type = obj.GetType(); 
var isMultiSlot = type.IsGenericType && 
        type.GetGenericTypeDefinition() == typeof (MultiSlot<>); 

Это не будет работать для типов, унаследованных от MultiSlot<T>, хотя.

+0

Я полагаю, что добавление цикла «while» (в предыдущем ответе) заставляет код работать для унаследованных типов. Thnx! – yannischris

+0

Да, версия в другом посте лучше. –

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