C# mit Reflexion erstellen Sie eine struct
Ich bin derzeit ein wenig code schreiben, speichern von Allgemeinen Objekten zu XML-Daten mithilfe von Reflexion in c#.
Ist das problem beim Lesen der XML wieder in einige der Objekte sind Strukturen, und ich kann nicht herausfinden, wie man die Initialisierung des struct. Für eine Klasse, die ich nutzen kann
ConstructorInfo constructor = SomeClass.GetConstructor(Type.EmptyTypes);
jedoch für eine Struktur, es gibt keinen Konstruktor, der keine Parameter hat, so ist der obige code setzt Konstruktor auf null. Ich habe auch versucht
SomeStruct.TypeInitializer.Invoke(null)
aber das wirft ein memberaccessexception. Google gibt keine aussichtsreichen trifft. Jede Hilfe würde geschätzt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Werte sind Strukturen, Sie sind wahrscheinlich werden unveränderlich, so dass Sie nicht wollen, rufen Sie einen parameterlosen Konstruktor, sondern die eine, die nimmt die entsprechenden Werte als argument für den Konstruktor.
Wenn die Strukturen nicht unveränderlich sind, dann laufen Sie Weg von Ihnen so schnell wie möglich, wenn Sie können... wenn Sie aber absolut haben um dies zu tun, verwenden Sie dann
Activator.CreateInstance(SomeClass)
. Sie müssen sehr vorsichtig sein, wenn Sie reflektion verwenden, um Eigenschaften oder Felder auf den Wert geben, aber - ohne, dass die Sorge, Sie werden am Ende erstellen Sie eine Kopie, ändern Sie den Wert auf die Kopie, und dann werfen Sie es Weg. Ich vermuten, dass, wenn Sie eine Box-version im Laufe, du wirst in Ordnung sein:byte
? Da es unveränderlich ist, ich kann nicht nur dessen Wert nach dem erstellen der Instanz. Wie setzen Sie seinen Wert mitActivator
?CreateInstance wird dir nicht helfen, mit Strukturen, mit keinen explizit definierten Konstruktoren.
Diesem funktioniert der trick mit dem leeren Strukturen.
Nur hinzufügen - mit unveränderlich Strukturen, die Sie wahrscheinlich zu tun haben passenden parameter an den Konstruktor. Leider ist dies schwierig, wenn es mehrere Konstrukte, und vor allem, da einige Arten haben einen separaten statischen "Create" - Methode anstelle von öffentlichen Konstruktor. Aber vorausgesetzt Sie getan haben, die passenden, können Sie immer noch
Activator.CreateInstance
:Jedoch - code, wählen Sie einen Konstruktor (der hat oben 3...) ist nicht einfach. Man könnte sagen, "Holen die meisten komplexen" und dann versuchen Sie, match-parameter-Namen zu property-Namen (groß-und Kleinschreibung)...
Ein naives Beispiel: