2014-12-15 3 views
1

Учитывая этот класс:Как узнать, имеет ли свойствоInfo тип IList в C#?

public class SomeClass 
{ 
    public int SomeProperty { get; set; } 
    public IList<AnotherClass> MyList { get; set; } 
} 

И этот код:

SomeClass myClass = new SomeClass(); 

PropertyInfo[] properties = myClass.GetType().GetProperties(); 
for(int i = 0; i < properties.Length; i++) 
{ 
    //How can I figure that the current property is a collection/list? 
} 

Что я пробовал:

bool a1 = properties[i].PropertyType.IsAssignableFrom(typeof(IList)); 
//false 
bool a2 = properties[i].PropertyType.IsAssignableFrom(typeof(IList<>)); 
//false 
bool a3 = typeof(IList).IsAssignableFrom(properties[i].PropertyType); 
//false 
bool a4 = typeof(IList<>).IsAssignableFrom(properties[i].PropertyType); 
//false 
bool a5 = properties[i].PropertyType.Equals(typeof(IList)); 
//false 
bool a6 = properties[i].PropertyType.Equals(typeof(IList<>)); 
//false 
bool a7 = properties[i].PropertyType.IsSubclassOf(typeof(IList)); 
//false 
bool a8 = properties[i].PropertyType.IsSubclassOf(typeof(IList<>)); 
//false 
bool a9 = properties[i].PropertyType is IList; 
//false 
bool a0 = typeof(ICollection<>).IsAssignableFrom(properties[i].PropertyType); 
//false 

Plus все вышеперечисленные с PropertyType.GetType(). Как я могу это понять?

+0

Я хотел бы отметить, что вы используете 'IsAssignableFrom' назад [DotNetFiddleExample] (https://dotnetfiddle.net/5VgD6n) в некоторых ваших примерах. –

+0

'a3' должен был возвратиться true. –

ответ

3

Вы можете использовать GetGenericTypeDefinition

if(properties[i].PropertyType.IsGenericType && 
    properties[i].PropertyType.GetGenericTypeDefinition() == typeof(IList<>)) 

Это вернет истинный для всех IList<> types.If вы хотите проверить для других, (ICollection, IEnumerable и т.д.), вы можете сделать то же чек на них, а также ,

+0

, но это не удастся, imo, в классе с различными свойствами. 'GetGenericTypeDefinition (..)' можно вызывать только при свойствах общего типа, а на другом - исключение. Нужна проверка безопасности. – Tigran

+0

@ Тигран, вы правы, спасибо, что указали это. Я добавил проверку, чтобы убедиться, что тип является общим. –