Как определить, является ли свойство своего рода массивом.
Пример:
public bool IsPropertyAnArray(PropertyInfo property)
{
// return true if type is IList<T>, IEnumerable<T>, ObservableCollection<T>, etc...
}
Как определить, является ли свойство своего рода массивом.
Пример:
public bool IsPropertyAnArray(PropertyInfo property)
{
// return true if type is IList<T>, IEnumerable<T>, ObservableCollection<T>, etc...
}
Кажется, вы задаете два разных вопроса: является ли тип массивом (например, string[]
) или любым типом коллекции.
Для первого просто проверьте property.PropertyType.IsArray
.
Для последнего вам нужно решить, каковы минимальные критерии, по которым вы хотите соответствовать типу. Например, вы можете проверить не-общий IEnumerable
с помощью typeof(IEnumerable).IsAssignableFrom(property.PropertyType)
. Вы также можете использовать это для общих интерфейсов, если знаете фактический тип T, например. typeof(IEnumerable<int>).IsAssignableFrom(property.PropertyType)
.
Проверка общего IEnumerable<T>
или любого другого общего интерфейса, не зная значения T, можно проверить, если property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName)
не null
. Обратите внимание, что я не указывал тип для T
в этом коде. Вы можете сделать то же самое для IList<T>
или любого другого типа, который вас интересует.
Например, вы можете использовать следующее, если вы хотите проверить общий IEnumerable<T>
:
public bool IsPropertyACollection(PropertyInfo property)
{
return property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null;
}
Массивы также реализуют IEnumerable, поэтому они также возвращают true
из этого метода.
Исключить класс String
, поскольку он квалифицируется как коллекция, потому что он реализует IEnumerable<char>
.
public bool IsPropertyACollection(this PropertyInfo property)
{
return (!typeof(String).Equals(property.PropertyType) &&
typeof(IEnumerable).IsAssignableFrom(property.PropertyType));
}
Если вы хотите узнать, является ли свойство массивом, это на самом деле очень просто:
property.PropertyType.IsArray;
изменить
Если вы хотите узнать, является ли это типом, который реализует IEnumerable, как и все "типы коллекций", это тоже не очень сложно:
return property.PropertyType.GetInterface("IEnumerable") != null;
public static bool IsGenericEnumerable(Type type)
{
return type.IsGenericType &&
type.GetInterfaces().Any(
ti => (ti == typeof (IEnumerable<>) || ti.Name == "IEnumerable"));
}
public static bool IsEnumerable(Type type)
{
return IsGenericEnumerable(type) || type.IsArray;
}
Для меня следующее не работает,
return property.PropertyType.GetInterface(typeof(ICollection<>).FullName) != null;
Следующее работало,
typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())
Это ярлык для проверки ICollection<IInterface>
или ICollection<BaseClassInTree>
var property = request as PropertyInfo;
property.PropertyType.IsGenericType && (typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())) && typeof().IsAssignableFrom(property.PropertyType.GenericTypeArguments[0])