Просто используйте префикс __block
, чтобы объявить и назначить любой тип переменной внутри блока.
Например:
__block Person *aPerson = nil;
__block NSString *name = nil;
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;
}
}
Ответ Марка - это подход, который я использую для этого, но для простоты (и более удобного API?) Вы можете определить свойство в базовом классе коллекции, если оно у вас есть, например:
public abstract class CollectionBase<T> : IList<T>
{
...
public Type ElementType
{
get
{
return typeof(T);
}
}
}
Я нашел этот подход полезным и легким для понимания любым новичком в дженериках.