giovedì 30 settembre 2010

VB.NET: Recuperare i tipi argomenti di un oggetto istanza di un generico

In questo breve post vorrei mostrarvi come capire se un oggetto che avete sotto mano è un generico (o, per dirla meglio, è l’istanza di un generico), recuperare il generico di cui è istanza e i tipi degli argomenti tipo.

Prendiamo, ad esempio la classe:

  1. Tuple(Of String, Int32, Boolean, Double?)

Questa è la definizione concreta di una classe generics, la Tuple(Of T1,T2,T3,T4) di cui gli argomenti tipo sono, rispettivamente: String, Int32, Boolean e Double? .

Letta così sappiamo facilmente capire tutto ciò, ma come facciamo a fare altrettanto all’interno di un nostro software?

Per fare questo ci vengono i aiuto alcuni metodi della classe Type.

In particolare possiamo scrivere:

  1. Dim obj = New Tuple(Of String, Int32, Boolean, Double?)("", 1, True, Nothing)
  2.  
  3. Dim isGeneric = obj.GetType().IsGenericType
  4. Dim genericType = obj.GetType().GetGenericTypeDefinition()
  5. Dim genericArgs = obj.GetType().GetGenericArguments
  6.  
  7. Console.WriteLine(genericType.FullName)
  8. For Each arg In genericArgs
  9.     Console.WriteLine(arg.FullName)
  10. Next

La proprietà IsGenericType ci permette di capire se un tipo è l’istanza di un generics.

Il metodo GetGenericTypeDefinition(), eseguito su un oggetto con IsGenericType = True, restituisce il tipo generico da cui è stato istanziato l’oggetto (nel caso nostro Tuple(Of T1,T2,T3,T4) ). Se il metodo è richiamato su un oggetto che non è istanza di un generico (ad esempio String) otteniamo un’eccezione.

Il metodo GetGenericArguments() ci fornisce un array di Type che identificano il tipo degli argomenti tipo del generico.

Il risultato del precedente codice è:

image

Nessun commento: