Type tColl = typeof(ICollection<>);
foreach (PropertyInfo p in (o.GetType()).GetProperties()) {
Type t = p.PropertyType;
if (t.IsGenericType && tColl.IsAssignableFrom(t.GetGenericTypeDefinition()) ||
t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == tColl)) {
Console.WriteLine(p.Name + " IS an ICollection<>");
} else {
Console.WriteLine(p.Name + " is NOT an ICollection<>");
}
}
Se necesitan las pruebas t.IsGenericType
y x.IsGenericType
, de lo contrario GetGenericTypeDefinition()
lanzará una excepción si el tipo no es genérica.
Si la propiedad se declara como ICollection<T>
, entonces tColl.IsAssignableFrom(t.GetGenericTypeDefinition())
devolverá true
.
Si la propiedad se declara como un tipo que implementa ICollection<T>
continuación t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == tColl)
volverá true
.
Tenga en cuenta que tColl.IsAssignableFrom(t.GetGenericTypeDefinition())
devuelve false
por ejemplo, List<int>
.
he probado todas estas combinaciones para MyT o = new MyT();
private interface IMyCollInterface1 : ICollection<int> { }
private interface IMyCollInterface2<T> : ICollection<T> { }
private class MyCollType1 : IMyCollInterface1 { ... }
private class MyCollType2 : IMyCollInterface2<int> { ... }
private class MyCollType3<T> : IMyCollInterface2<T> { ... }
private class MyT
{
public ICollection<int> IntCollection { get; set; }
public List<int> IntList { get; set; }
public IMyCollInterface1 iColl1 { get; set; }
public IMyCollInterface2<int> iColl2 { get; set; }
public MyCollType1 Coll1 { get; set; }
public MyCollType2 Coll2 { get; set; }
public MyCollType3<int> Coll3 { get; set; }
public string StringProp { get; set; }
}
Salida:
IntCollection IS an ICollection<>
IntList IS an ICollection<>
iColl1 IS an ICollection<>
iColl2 IS an ICollection<>
Coll1 IS an ICollection<>
Coll2 IS an ICollection<>
Coll3 IS an ICollection<>
StringProp is NOT an ICollection<>
¿No deberías probar con algo como '' ICollection en lugar de '' Colección ? Muchas de las colecciones genéricas (p. Ej., 'List ') no heredan de 'Colección '. –
LukeH
'p.GetType()' devolverá un 'Tipo' que describe' RuntimePropertyInfo' en lugar del tipo de la propiedad. También 'GetGenericTypeDefinition()' arroja una excepción para los tipos no genéricos. –
Exactamente, GetGenericTypeDefinition arroja una excepción para los tipos no genéricos. – Shaggydog