2015-10-04 10 views
6

Ho qualche codice ....Come utilizzare la variabile locale come tipo? Il compilatore ha detto "è una variabile ma è usato come un tipo"

in ambiente run-time non sappiamo che tipo di tipo è la variabile v1! Per questo motivo dovremmo scrivere "if else" statement molte volte!

  if (v1 is ShellProperty<int?>) 
      { 
       v2 = (v1 as ShellProperty<int?>).Value; 
      } 
      else if (v1 is ShellProperty<uint?>) 
      { 
       v2 = (v1 as ShellProperty<uint?>).Value; 
      } 
      else if (v1 is ShellProperty<string>) 
      { 
       v2 = (v1 as ShellProperty<string>).Value; 
      } 
      else if (v1 is ShellProperty<object>) 
      { 
       v2 = (v1 as ShellProperty<object>).Value; 
      }   

L'ho scritto 4 volte! La differenza è solo nella ShellProperty < anyType>

Così, invece di scrivere questo un sacco di linee utilizzando "se else"
ho deciso di utilizzare utilizzare la reflection per ottenere il tipo di proprietà in fase di esecuzione!

 Type t1 = v1.GetType().GetProperty("Value").PropertyType; 
    dynamic v2 = (v1 as ShellProperty<t1>).Value; 

Questo codice può ottenere che tipo di PropertyType è v1 e assegna è ben lo t1 variabile locale.
Ma dopo che il mio compilatore dice che "t1 è una variabile ma è usato come un tipo"
Quindi non mi permette di scrivere t1 all'interno ShellProperty <>

prego di dirmi come risolvere questo problema e come ottenere un codice più compatto di quello che ho?
È necessario creare una nuova classe?

+1

Non è possibile utilizzare i generici in questo modo. I generici sono fortemente tipizzati in fase di compilazione. –

+0

Quindi vuoi dire che non è possibile – IremadzeArchil19910311

+0

non staticamente come questo. ma stai già facendo dinamico. –

risposta

8

Eri molto vicino, stavi solo perdere una chiamata a MakeGenericType.

credo che il codice sarà simile alla seguente:

Type t1 = v1.GetType().GetProperty("Value").PropertyType; 
var shellPropertyType = typeof(ShellProperty<>); 
var specificShellPropertyType = shellPropertyType.MakeGenericType(t1); 
dynamic v2 = specificShellPropertyType.GetProperty("Value").GetValue(v1, null); 

Edit: Come @PetSerAl rilevare ho aggiunto alcuni strati di indirezione che erano inutili. Scusa OP, probabilmente si desidera un supporto come:

dynamic v2 = v1.GetType().GetProperty("Value").GetValue(v1, null); 
+0

Funziona esattamente come voglio! Grazie! – IremadzeArchil19910311

+1

È così: 'v1.GetType(). GetProperty (" Value "). GetValue (v1, null)' non è sufficiente? – PetSerAl

+0

@PetSerAl Hai perfettamente ragione, mi sento molto sciocco. Ho passato troppo tempo a guardare il codice originale e non abbastanza tempo a pensare alla mia risposta. Aggiornerò ora. – Dex

5

Per i generici, è necessario crearli dinamicamente.

MethodInfo method = typeof(Sample).GetMethod("GenericMethod"); 
MethodInfo generic = method.MakeGenericMethod(myType); 
generic.Invoke(this, null); 

per creare un oggetto generico, è possibile

var type = typeof(ShellProperty<>).MakeGenericType(typeof(SomeObject)); 
var v2 = Activator.CreateInstance(type); 

Si prega di fare riferimento al Initializing a Generic variable from a C# Type Variable