Я подумал, что вы можете проверить интерфейсы, которые реализует тип свойства. (Удалены избыточные интерфейсы, поскольку IList наследует ICollection, а ICollection наследует IEnumerable.)
static void DoSomething<T>()
{
List<Type> collections = new List<Type>() { typeof(IEnumerable<>), typeof(IEnumerable) };
foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
{
if (propertyInfo.PropertyType != typeof(string) && propertyInfo.PropertyType.GetInterfaces().Any(i => collections.Any(c => i == c)))
{
continue;
}
Console.WriteLine(propertyInfo.Name);
}
}
Я добавил код, чтобы не отклонять строку, так как он также реализует IEnumerable, и я подумал, что вы, возможно, захотите оставить их рядом.
В свете избыточности предыдущего списка интерфейсов сбора, может быть проще просто написать код, подобный этому
static void DoSomething<T>()
{
foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
{
if (propertyInfo.PropertyType != typeof(string)
&& propertyInfo.PropertyType.GetInterface(typeof(IEnumerable).Name) != null
&& propertyInfo.PropertyType.GetInterface(typeof(IEnumerable<>).Name) != null)
{
continue;
}
Console.WriteLine(propertyInfo.Name);
}
}