Laden...

Dynamisch zur Laufzeit Klassen erzeugen

Erstellt von bibL vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.155 Views
B
bibL Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren
Dynamisch zur Laufzeit Klassen erzeugen

Ich habe das Forum durchsucht aber leider nichts passendes gefunden.

Ich sollte zur Laufzeit eine Klasse die eine Variable Anzahl an Properties enthält erzeugen, Bezeichnung und Typ der Properties erfahre ich erst zur Laufzeit.

Als Beispiel:

Ich erfahre zur Laufzeit daß ich eine Klasse brauche die ein Propertie "Name" enthalten soll welches vom Typ "String" ist.

Hoffe mir kann da jemand weiterhelfen

3.971 Beiträge seit 2006
vor 16 Jahren

Als alternative könnte ich dir eine Klasse anbieten, die



public class Wert
{
  
  private Dictionary<string, object> werte = new Dictionary<string, object>();

  public object this[string name]
  {
    get
    {
      return werte[name];
    }
    set
    {
      werte[name] = value;
    }
  }
}


Klasse zu verwenden und mittels Reflection bei Bedarf die Typen abfragen und auswerten. Weiß ja nich was du vorhast

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

O
778 Beiträge seit 2007
vor 16 Jahren

Da gibt es mehrere Wege:

  1. C#-Code generieren und kompilieren (einfach, langsam, unsicher)
  2. CodeDom generieren und kompilieren (komplizierter, mitelschnell, sicher)
  3. IL-Code generieren (sehr kompliziert, sehr schnell,total unsicher)

Bei Variante 1 und 2 brauchst du einen Compiler, vorzugsweise den Microsoft.CSharp.CSharpCodeProvider.

Variante 3 verfolgst du am besten gar nicht, was kleines wie ein paar Methoden kann man damit mal machen, mehr wird aber höllisch schwierig (geht aber)

B
bibL Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren

Es geht darum. Ich arbeite mit WPF und habe eine ListView.
Zur Laufzeit bekomme ich eine Liste von Spaltennamen anhand dennen ich meine Spalten erzeuge, auch das Binding läuft über diese Spalennamen.

Später bekomme ich eine Liste von Strings die jeweils einem Datensatz entsprechen und die ich gerne in diese ListView einfügen würde. Da aber das Binding über Properties läuft von dennen ich vorher nicht weiss wie sie heißen und wieviele es davon gibt, war mein ansatz diese Datenklassen dynamisch zu erzeugen mit Properties die vom Namen den Bindungen entsprechen.

O
778 Beiträge seit 2007
vor 16 Jahren

Tut mir Leid, mit WPF hab ich meich (leider) noch nicht beschäftigt...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo bibL,

für das, was du willst, scheint es mir ein OverKill zu sein, eine dynamische Klasse zu generieren. Verwende einfacher und besser eine DataTable.

herbivore

149 Beiträge seit 2007
vor 16 Jahren

Hallo,
solltest du aber trotz allem zur Laufzeit eine Klasse erstellen wollen, gibt es verschiedene Builderklassen dafür, z.B.

AssemblyBuilder, Fieldbuilder, Methodbuilder usw.

alles soweit zu finden im Namespace Reflection und Reflection.Emit

Gruß

HD

Man lernt auch im Alter nie aus

Mit 37 Fachinformatiker
Mit 38 (im August) Programmierer

O
778 Beiträge seit 2007
vor 16 Jahren

@HansDampf:
...mit denen aber schwer umzugehen ist, da ist CodeDOM noch einfacher zu verstehen...

347 Beiträge seit 2006
vor 16 Jahren

Original von onlinegurke
@HansDampf:
...mit denen aber schwer umzugehen ist, da ist CodeDOM noch einfacher zu verstehen... Dynamische IL ist ja auch nichts, was ein Application Dev mal einfach so machen sollte.
CodeDOM ist dafür da Source Code zu erzeugen, siehe wsdl.exe oder xsd.exe.
Das ist abartig langsam wenn man es dazu missbraucht wiederholt on-the-fly IL zu erzeugen und benötigt temporäre Dateien.

In diesem Fall ist beides die sprichwörtliche Kanone für die Spatzenjagd. Ein generischer Container wie DataTable würde es genauso tun.