2010-04-01 7 views
20

estoy reflejando una propiedad 'Bla' su tipo es ICollectionC# Reflexión - (! Como era de esperar) Encuentre el tipo genérico de una colección

public ICollection<string> Blah { get; set; } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     var pi = GetType().GetProperty("Blah"); 
     MessageBox.Show(pi.PropertyType.ToString()); 
    } 

Esto me da ICollection<string> ...

Pero realmente quiero obtener el tipo de colección, es decir, ICollection (en lugar de ICollection<string>) - ¿Alguien sabe cómo lo haría por favor?

+1

Pero su tipo ** es ** 'ICollection ' ... –

+0

De acuerdo, 'ICollection' y' ICollection 'son dos tipos completamente diferentes. – LukeH

Respuesta

21

Usted está buscando el método GetGenericTypeDefinition:

MessageBox.Show(pi.PropertyType.GetGenericTypeDefinition().ToString()); 
+1

Tenga en cuenta que esto devolverá "ICollection'1 [T]", que es CLR-speak para "ICollection ". Hubiera sugerido lo mismo, entonces +1. – LukeH

+0

¡Gracias, eso funciona un placer! –

31

Usted querrá mirar a GetGenericTypeDefinition por ejemplo:

List<String> strings=new List<string>(); 


     Console.WriteLine(strings.GetType().GetGenericTypeDefinition()); 
     foreach (var t in strings.GetType().GetGenericArguments()) 
     { 
      Console.WriteLine(t); 

     } 

Esta es la salida:

sistema. Collections.Generic.List`1 [T]
System.String

+4

+1 para 'GetGenericArguments'. Eso es realmente lo que estaba buscando cuando aterricé aquí. – Grinn

1

Tuve un problema similar pero mucho más complicado ... Quería determinar si un tipo se puede asignar dinámicamente a los miembros del tipo de colección o al tipo de matriz.

lo tanto, aquí es mejor manera de cómo conseguir tipo de miembro de colección o una matriz dinámica con una validación si el tipo de un objeto a añadir es asignable a la colección o los miembros de tipo matriz:

 List<IComparable> main = new List<IComparable>() { "str", "řetězec" }; 
     IComparable[] main0 = new IComparable[] { "str", "řetězec" }; 
     IEnumerable collection = (IEnumerable)main; 
     //IEnumerable collection = (IEnumerable)main0; 
     string str = (string) main[0]; 
     if (collection.GetType().IsArray) 
     { 
      if (collection.GetType().GetElementType().IsAssignableFrom(str.GetType())) 
      { 
       MessageBox.Show("Type \"" + str.GetType() + "\" is ok!"); 
      } 
      else 
      { 
       MessageBox.Show("Bad Collection Member Type"); 
      } 
     } 
     else 
     { 
      if (collection.GetType().GenericTypeArguments[0].IsAssignableFrom(str.GetType())) 
      { 
       MessageBox.Show("Type \"" + str.GetType() + "\" is ok!"); 
      } 
      else 
      { 
       MessageBox.Show("Bad Collection Member Type"); 
      } 
     } 
Cuestiones relacionadas