Zum Inhalt springen

[C#] Dynamisches Databinding von Klassen


Shadowman

Empfohlene Beiträge

Hallo zusammen,

ich habe mir ein sehr einfaches Interface geschrieben, was ich dazu nutzen möchte, einem Attribut zur laufzeit einen Typen zuzuweisen.

Das ganze kommt durch folgenden Gedanken:

Ich habe eine Liste mit Namen von Objekten in meiner Datenbank und kann sie beliebig anderen Elementen zuordnen.

Jeder Eintrag soll durchlaufen werden und dann soll einer Generic.List die entsprechende Klasse zum ausgelesenen Namen hinzugefügt werden um sie nachher weiter zu verarbeiten.

Ich habe bereits DataBinder.Eval gefunden, .

Von der Beschreibung her hatte ich es mal mit dem DataBinder.Eval versucht, jedoch leider keinen erfolg, da er anscheinend nur mit Variablen und nicht mit Klassen funktioniert:

iDatasource t_source = null;

DataBinder.Eval(t_source,"new " + this.name + "()");

in this.name ist der name der Klasse enthalten.

Kann ich das Irgendwie dynamisch bewerkstelligen, oder muss ich per switch-case für jede Möglichkeit einen Fall einrichten?

Ich hoffe mir kann da jemand helfen, falls noch was unklar sein sollte, Asche auf mein Haupt und einfach fragen ;).

Gruß

Shadowman

Bearbeitet von Shadowman
Link zu diesem Kommentar
Auf anderen Seiten teilen

Was verstehst Du unter "Attribut"

Attribute im .NET können nur konstante Wert übernehmen. D.h. diese müssen zur Entwurfszeit beeits feststehen.

Das Auswerten eines Attributes erfolgt mit Hilfe von Reflection.


// Pseudocode


[Required]

[StringLength(25, ErrorMessage="Länge max. 25 Zeichen")]

public string Name

{

    get; set;

}

EDIT:

Wie sieht so ein "Name" einesObjektes aus?

Wenn den vollqualifizierten Namen der Klasse hast, kannst du mit Reflection arbeiten.

Bearbeitet von lbm1305
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, also hole ich etwas weiter aus.

Attibut -> Variable einer Klasse

Ich habe eine Klasse "dokument", dieses Dokument hat ein Attribut vom Typ List "datenquellen".

Jede Datenquelle kann unterschiedliche Bezugsquellen haben (datenbank, session, etc.).

Jede Datenquelle enthält einige informationen zur Datenquelle an sich und ein eigenes Attribut, welches eine Instanz der Klasse sein soll, welche die tatsächlichen Datenbeschaffung übernimmt.

Attribute:

        private iDatasource cSource;

        private List<sParameter> lInput;

        private List<sParameter> lFill
Methode run:
        public void run(ref List<KeyValuePair<String, String>> vars, ref List<String> input)

        {

            List<sParameter> t_fill = new List<sParameter>();

            List<sParameter> t_input = new List<sParameter>();


            DataBinder.Eval(this.cSource,"new " + this.name + "()");

            cSource.run(ref t_vars, ref t_input);


            lFill.AddRange(t_fill);

            lInput.AddRange(t_input);

        }

Ich weiß leider nicht, was du mit einem "vollqualifizierten Namen" der Klasse meinst, aber als Beispiel:

- this.name ist "user_data"

- Dateiname ist "user_data.cs"

- Klassenname ist "user_data"

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die genaue Bezeichnung ist 'AssemblyQualifiedName'. Für eine Beispielklasse 'UserData' kann dieser wie folgt aussehen: 'DemoApp.DataSource.UserData, DemoApp'

Dabei liegt diese Klasse 'UserData' in eine Assembly namens 'DemoApp' => DataSource ist der Namespace, in dem die Klasse liegt.


            var path = @"DemoApp.DataSource.UserData, DemoApp";


            var type = Type.GetType(path);


            if (type != null)

            {

                var instance = Activator.CreateInstance(type);

            }

'instance' ist 'object' und muss entweder auf den konkreten Typ gecasted werden oder Du kannst die Instanz per Reflection weiter bearbeiten.

Versuche bitte die Begriffe zu verwenden, die im .NET-Umfeld typischerweise benutzt werden.

Eigenschaften / Properties

(Private) Felder

Methoden

Klassen

Attribute werden zum annotieren von Klassen, Methoden, Eigenschaften usw. benutzt.

Bearbeitet von lbm1305
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich werde versuchen die korrekten Begriffe zu verwenden. Dazu werde ich mir aber nochmal genau anschauen müssen, was was war.

Ich habe jetzt eine Testvariante eingebaut, jedoch kann ich sie noch nicht testen, da gerade die Datenbankverbindung angeschmiert ist. Ich glaube aber schon, dass ich das begriffen habe, was du beschrieben hast, nur baue ich ansteinend den path falsch auf.

Die Klasse liegt im Namespace "Projekt.Classes.Datasource.session"

Datenstruktur:

Projekt/Classes/Datasource/session/user_class.cs

Ich habs jetzt folgendes versucht:

var path = @"Projekt.Classes.Datasource.session.user_data, Projekt";

var path = @"Projekt.Classes.Datasource.session, user_data";

In beiden Fällen ist type jedoch null.

Link zu diesem Kommentar
Auf anderen Seiten teilen

1) Die Assembly heißt tatsächlich nur 'Projekt' ?

2) Hat die aufrufende Assembly einen Verweise auf die Assembly, in der die Klassen liegen?

Ggf kann man auch so vorgehen.


var type = typeof(user_data);

var assemblyQualifiedName = type.AssemblyQualifiedName;

Version, Culture und PublicKeyToken kann man weglassen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh mein Gott!!!

Die erste von mir geschriebene Variante hat funktioniert. Ich habe in meinem Testfall nur schon zwei weitere Datenquellen angegeben, welche als Dateien noch nicht angelegt sind. Aus diesem Grund kam dort kein aufruf der Klasse.

Jetzt läuft es. Vielen Dank für deine Hilfe!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...