Wie kann ich einer Klasse zur Laufzeit in C # Eigenschaften hinzufügen?

8
___ answer14725237 ___

Ich denke, Sie haben falsch verstanden, was Reflexion ist. Mit Reflection können Sie den ausgeführten Code nicht ändern. Es kann Ihnen erlauben, Ihren eigenen Code zu lesen und sogar diesen Code auszuführen.

Mit Reflection.Emit können Sie eine ganz neue Assembly schreiben und dann in den Speicher laden.

Sie können jedoch keine Klasse zur Laufzeit ändern. Stellen Sie sich vor, Sie haben eine Klasse Foo, Sie installieren eine ganze Reihe von ihnen, dann entscheiden Sie, die Klasse zu ändern.

Was soll mit all den Foos geschehen, die Sie bereits installiert haben?

Was Sie jedoch tun können, ist Reflection.Emit, um eine neue Klasse zu erstellen, die Foo, genannt Bar, erbt und dann alles, was Sie zu dieser Klasse brauchen, hinzufügt.

Alternativ können Sie IL Weaving / AOP betrachten, wenn Sie eine Eigenschaft nach der Kompilierungszeit, aber VOR der Laufzeit programmgesteuert zu einer Klasse hinzufügen möchten. Ich schlage vor, PostSharp oder Fody zu betrachten wenn Sie interessiert sind.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die zum Erstellen einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ tag123reflection ___ Reflection ist die Fähigkeit eines Programms, seine Struktur und / oder sein Verhalten zur Laufzeit zu beobachten und / oder zu ändern. ___ tag123net40 ___ Version 4.0 von .NET Framework. Verwenden Sie für Fragen speziell zu .NET Framework 4.0. Bei Fragen zu .NET Framework verwenden Sie im Allgemeinen das .net-Tag. ___ tag123properties ___ Eine Eigenschaft in einigen objektorientierten Programmiersprachen ist eine spezielle Art von Klassenmember, die zwischen einem Feld (oder Datenelement) und einer Methode liegt. Eigenschaften werden wie Felder gelesen und geschrieben, aber Lese- und Schreibvorgänge für Eigenschaften werden (normalerweise) übersetzt, um Methodenaufrufe zu erhalten und festzulegen. ___ answer14724845 ___

Ja, Sie können die Klasse %code% verwenden, um dies zu erreichen.

%Vor%     
___ qstnhdr ___ Wie kann ich einer Klasse zur Laufzeit in C # Eigenschaften hinzufügen? ___
Royi Namir 06.02.2013, 08:43
quelle

3 Antworten

24
___ answer14725237 ___

Ich denke, Sie haben falsch verstanden, was Reflexion ist. Mit Reflection können Sie den ausgeführten Code nicht ändern. Es kann Ihnen erlauben, Ihren eigenen Code zu lesen und sogar diesen Code auszuführen.

Mit Reflection.Emit können Sie eine ganz neue Assembly schreiben und dann in den Speicher laden.

Sie können jedoch keine Klasse zur Laufzeit ändern. Stellen Sie sich vor, Sie haben eine Klasse Foo, Sie installieren eine ganze Reihe von ihnen, dann entscheiden Sie, die Klasse zu ändern.

Was soll mit all den Foos geschehen, die Sie bereits installiert haben?

Was Sie jedoch tun können, ist Reflection.Emit, um eine neue Klasse zu erstellen, die Foo, genannt Bar, erbt und dann alles, was Sie zu dieser Klasse brauchen, hinzufügt.

Alternativ können Sie IL Weaving / AOP betrachten, wenn Sie eine Eigenschaft nach der Kompilierungszeit, aber VOR der Laufzeit programmgesteuert zu einer Klasse hinzufügen möchten. Ich schlage vor, PostSharp oder Fody zu betrachten wenn Sie interessiert sind.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die zum Erstellen einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ tag123reflection ___ Reflection ist die Fähigkeit eines Programms, seine Struktur und / oder sein Verhalten zur Laufzeit zu beobachten und / oder zu ändern. ___ tag123net40 ___ Version 4.0 von .NET Framework. Verwenden Sie für Fragen speziell zu .NET Framework 4.0. Bei Fragen zu .NET Framework verwenden Sie im Allgemeinen das .net-Tag. ___ tag123properties ___ Eine Eigenschaft in einigen objektorientierten Programmiersprachen ist eine spezielle Art von Klassenmember, die zwischen einem Feld (oder Datenelement) und einer Methode liegt. Eigenschaften werden wie Felder gelesen und geschrieben, aber Lese- und Schreibvorgänge für Eigenschaften werden (normalerweise) übersetzt, um Methodenaufrufe zu erhalten und festzulegen. ___ answer14724845 ___

Ja, Sie können die Klasse %code% verwenden, um dies zu erreichen.

%Vor%     
___ qstnhdr ___ Wie kann ich einer Klasse zur Laufzeit in C # Eigenschaften hinzufügen? ___
dtb 06.02.2013, 08:47
quelle
4

Ich denke, Sie haben falsch verstanden, was Reflexion ist. Mit Reflection können Sie den ausgeführten Code nicht ändern. Es kann Ihnen erlauben, Ihren eigenen Code zu lesen und sogar diesen Code auszuführen.

Mit Reflection.Emit können Sie eine ganz neue Assembly schreiben und dann in den Speicher laden.

Sie können jedoch keine Klasse zur Laufzeit ändern. Stellen Sie sich vor, Sie haben eine Klasse Foo, Sie installieren eine ganze Reihe von ihnen, dann entscheiden Sie, die Klasse zu ändern.

Was soll mit all den Foos geschehen, die Sie bereits installiert haben?

Was Sie jedoch tun können, ist Reflection.Emit, um eine neue Klasse zu erstellen, die Foo, genannt Bar, erbt und dann alles, was Sie zu dieser Klasse brauchen, hinzufügt.

Alternativ können Sie IL Weaving / AOP betrachten, wenn Sie eine Eigenschaft nach der Kompilierungszeit, aber VOR der Laufzeit programmgesteuert zu einer Klasse hinzufügen möchten. Ich schlage vor, PostSharp oder Fody zu betrachten wenn Sie interessiert sind.

    
Aron 06.02.2013 09:09
quelle
1

Ja, Sie können die Klasse ExpandoObject verwenden, um dies zu erreichen.

%Vor%     
Daniel Hilgarth 06.02.2013 08:45
quelle