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"
.
- 1. Confronto dei tipi di base nella riflessione
- 2. Valore di campo generico di riflessione generico
- 3. Come posso determinare i tipi di proprietà usando la riflessione?
- 4. Riflessione Scala con tipi parametrizzati
- 5. Uso della riflessione per impostare il valore di una Int32
- 6. Creare un'istanza di Enum sconosciuto con valore di stringa utilizzando la riflessione in C#
- 7. Come creare metodi di estensione per Tipi
- 8. Riflessione .NET: Trova i tipi usati
- 9. Come confrontare i tipi di valore "Qualsiasi"
- 10. Limitazioni di riflessione in Silverlight
- 11. Tipi di valore e riferimento
- 12. Creare un nuovo oggetto usando la riflessione?
- 13. In C#, l'uso di tipi di valore vs tipi di riferimento
- 14. Eventuali esperienze che utilizzano SharpDevelop per creare un'app ASP.NET MVC?
- 15. Unboxing generico di tipi di valore boxed
- 16. Confronti diretti di tipi di valore C#
- 17. Proprietà sintetizzate per tipi di dati primitivi che utilizzano ARC - weak o assign?
- 18. problemi di memoria che utilizzano Heroku puma
- 19. Metodi di refactoring che utilizzano lo stesso codice ma tipi diversi
- 20. Come creare il prodotto cartesiano di una lista di tipi?
- 21. Impostazione delle proprietà di un oggetto tramite riflessione con diversi tipi di proprietà
- 22. Progetti all'interno di progetti che utilizzano Git
- 23. Database di grafici che utilizzano la località
- 24. GUI di Sudoku che utilizzano java
- 25. Progetti che utilizzano py.test
- 26. Errori che utilizzano yuicompressor
- 27. creare diversi tipi di distribuzione con setup.py
- 28. Impostazione di una proprietà per riflessione con un valore stringa
- 29. Differenza di due matrici che utilizzano Perl
- 30. "Tipi primitivi" rispetto a "tipi di valore predefiniti"
System.String è un tipo di riferimento, non un tipo di valore. –