Obtener la lista si las propiedades de tipo ICollection de la clase genérica

Tengo un objeto que contiene algunas propiedades de tipo ICollection

Así que básicamente la clase se ve así:

Class Employee { public ICollection
Addresses {get;set;} public ICollection Performances {get; set;} }

El problema es obtener nombres de propiedad de tipo ICollection, dentro de la clase Genérica, mediante el uso de la reflexión.

Mi clase genérica es

 Class CRUD { public object Get() { var properties = typeof(TEntity).GetProperties().Where(m=m.GetType() == typeof(ICollection ) ... } 

Pero no está funcionando.

¿Cómo puedo obtener una propiedad aquí?

GetProperties() devuelve un PropertyInfo[] . Luego haces un Where usando m.GetType() . Si asumimos que te perdiste un > , y esto es m=>m.GetType() , entonces en realidad estás diciendo:

  typeof(PropertyInfo) == typeof(ICollection) 

(advertencia: en realidad, es probable que sea un RuntimePropertyInfo , etc.)

Lo que quieres decir es probablemente:

 typeof(ICollection).IsAssignableFrom(m.PropertyType) 

¡Sin embargo! Tenga en cuenta que ICollection <> ICollection<> <> ICollection

etc., por lo que no es tan fácil. Puede que necesites:

 m.PropertyType.IsGenericType && m.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>) 

Confirmado; esto funciona:

 static void Main() { Foo(); } static void Foo() { var properties = typeof(TEntity).GetProperties().Where(m => m.PropertyType.IsGenericType && m.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>) ).ToArray(); // ^^^ contains Addresses and Performances } 

Puede usar IsGenericType y GetGenericTypeDefinition con typeof(ICollection<>)

 public object Get() { var properties = typeof (TEntity).GetProperties() .Where(m => m.PropertyType.IsGenericType && m.PropertyType.GetGenericTypeDefinition() == typeof (ICollection<>)); }