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
risposta
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);
Grazie ha aiutato. –
Oh, adorabile per roba generica :) – Nyerguds
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.
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
Haha - devi essere veloce nel sorteggio :-) –
questo funziona per me:
int x = (int)Activator.CreateInstance(typeof (Int32), true);
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"
.
System.String è un tipo di riferimento, non un tipo di valore. –