2010-01-04 12 views
8

Voglio creare un'istanza di tipi di valore come System.String, System.Boolean, System.Int32, ecc ricevo nomi qualificati di tipi come System.String oMyNamespace.Employee e devo creare un'istanza e tornare indietro. Io uso Activator.CreateInstance e FormatterServices.GetUninitializedObject per creare istanze. Ma fallisce in caso di tipi di valore. Non riesco a codificare la logica in caso di tipi di valore. Ho bisogno di un modo generico per creare istanze di entrambi i tipi di valore e tipi di riferimento.Come creare un'istanza di tipi di valore che utilizzano riflessione

+3

System.String è un tipo di riferimento, non un tipo di valore. –

risposta

11

Che cosa stai cercando di fare esattamente? FormatterServices.GetUninitializedObject viene utilizzato principalmente dal codice di serializzazione; al di fuori di questo non dovresti davvero usarlo. Si suona come si potrebbe solo bisogno di qualcosa come TypeConverter, vale a dire (per questi tipi)

TypeConverter tc = TypeDescriptor.GetConverter(someType); 
object obj = tc.ConvertFromString(s); 
+0

Grazie ha aiutato. –

+0

Oh, adorabile per roba generica :) – Nyerguds

3

Che cosa esattamente sta fallendo? Ho provato il seguente codice per vedere se c'è un problema con i tipi di valore:

var instance = Activator.CreateInstance(typeof(Int32)); 

Mi dà un'istanza Int32 impostato a 0.

Dove esattamente è il codice fallendo? Altrimenti direi che il problema sta nel modo in cui si sta caricando il tipo, non nel modo in cui si sta creando l'istanza.

+0

Eish Jaco! Sono tornato indietro per cambiare il mio 'var' in un 'int', nel caso in cui 'var' non fosse familiare all'OP, e ti intrufoli nella stessa identica riga di codice di me. :-) – ProfK

+0

Haha - devi essere veloce nel sorteggio :-) –

0

questo funziona per me:

int x = (int)Activator.CreateInstance(typeof (Int32), true); 
1

Per Tipi di valore BCL (e quando si utilizza stringhe per descrivere i tipi) assicurarsi non si sta utilizzando C# parole chiave e assicurare che il tipo è pienamente qualificato con namespace. Ad esempio, C# int viene creato correttamente in questo modo con Activator.CreateInstance (..)

object num = Activator.CreateInstance(Type.GetType("System.Int32")); 

Otterrete tentativi falliti, se si tenta di utilizzare gli alias specifici di una lingua come "int" o forme brevi come "Int32".

Problemi correlati