2010-04-01 10 views
20

Sto riflettendo una proprietà 'Blah' il suo tipo è ICollectionC# Reflection - (! Come ci si aspetterebbe) Trovare il tipo generico di una collezione

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

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

Questo mi dà ICollection<string> ...

Ma in realtà voglio ottenere il tipo di raccolta cioè ICollection (anziché ICollection<string>) - qualcuno sa come farei questo per favore?

+1

Ma il suo type ** is ** 'ICollection ' ... –

+0

Concordato, 'ICollection' e' ICollection 'sono due tipi completamente diversi. – LukeH

risposta

21

Stai cercando il metodo di GetGenericTypeDefinition:

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

Si noti che ciò restituirà "ICollection'1 [T]", che è CLR-speak per "ICollection ". Avrei suggerito la stessa cosa, quindi +1. – LukeH

+0

Grazie, è una sorpresa! –

31

Ti consigliamo di guardare GetGenericTypeDefinition ad esempio:

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


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

     } 

Questo stamperà:

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

+4

+1 per 'GetGenericArguments'. Questo è quello che stavo cercando quando sono atterrato qui. – Grinn

1

Avevo un problema simile ma molto più complicato ... Volevo determinare se un tipo è assegnabile dinamicamente ai membri del tipo di raccolta o ai membri del tipo di matrice.

Quindi, ecco il modo migliore come ottenere tipo membro di raccolta o array dinamico con una convalida se il tipo di un oggetto da aggiungere è assegnabile alla raccolta oi membri di tipo array:

 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"); 
      } 
     } 
Problemi correlati