Shadowman Geschrieben 1. August 2014 Geschrieben 1. August 2014 (bearbeitet) 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 1. August 2014 von Shadowman Zitieren
lbm1305 Geschrieben 1. August 2014 Geschrieben 1. August 2014 (bearbeitet) 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 1. August 2014 von lbm1305 Zitieren
Shadowman Geschrieben 1. August 2014 Autor Geschrieben 1. August 2014 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" Zitieren
lbm1305 Geschrieben 1. August 2014 Geschrieben 1. August 2014 (bearbeitet) 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 1. August 2014 von lbm1305 Zitieren
Shadowman Geschrieben 1. August 2014 Autor Geschrieben 1. August 2014 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. Zitieren
lbm1305 Geschrieben 1. August 2014 Geschrieben 1. August 2014 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 Zitieren
Shadowman Geschrieben 1. August 2014 Autor Geschrieben 1. August 2014 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! Zitieren
Empfohlene Beiträge
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.