Универсальный список C# <T>, как получить тип T? [дубликат]

Просто используйте префикс __block, чтобы объявить и назначить любой тип переменной внутри блока.

Например:

__block Person *aPerson = nil;

__block NSString *name = nil;
109
задан casperOne 21 May 2012 в 11:49
поделиться

2 ответа

Type type = pi.PropertyType;
if(type.IsGenericType && type.GetGenericTypeDefinition()
        == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0]; // use this...
}

В общем, для поддержки любого IList вам необходимо проверить интерфейсы:

foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType &&
        interfaceType.GetGenericTypeDefinition()
        == typeof(IList<>))
    {
        Type itemType = type.GetGenericArguments()[0];
        // do something...
        break;
    }
}
216
ответ дан 24 November 2019 в 03:20
поделиться

Ответ Марка - это подход, который я использую для этого, но для простоты (и более удобного API?) Вы можете определить свойство в базовом классе коллекции, если оно у вас есть, например:

public abstract class CollectionBase<T> : IList<T>
{
   ...

   public Type ElementType
   {
      get
      {
         return typeof(T);
      }
   }
}

Я нашел этот подход полезным и легким для понимания любым новичком в дженериках.

9
ответ дан 24 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: