Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[C#] Dynamisches Databinding von Klassen

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor

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"

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

  • Autor

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.

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

  • Autor

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!

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.