Laden...

Generic konvertieren / sensible Konfigurationsdaten speichern

Erstellt von Maruu vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.434 Views
M
Maruu Themenstarter:in
121 Beiträge seit 2006
vor 14 Jahren
Generic konvertieren / sensible Konfigurationsdaten speichern

Hallo,

ich will mittels Generic Methoden eine Speichern- und Laden- Methode für belibige Datentypen realisieren. Das Speichern klappt soweit auch problemlos, nur beim Laden hab ich noch meine Probleme. Folgende Methode will ich dafür verwenden (hab die Methode vereinfacht um es besser zu veranschaulichen):



private T LadeEinstellung<T>()
{  
   List<string> tmpListe = new List<string>(){"a","b","c"};
   
   if(typeof(T) == typeof(List<string>))
      return tmpListe;
   else
      return default(T);
}


Soweit meine Methode, beispielhaft erstelle ich eine Liste die mit a,b,c gefüllt wird.
Wenn der Generic T eine string-Liste ist dann soll meine Liste auch zurückgegeben werden, doch so wie ich das oben machen will mit "return tmpListe;" funktioniert das leider nicht. Ich muss vorher die Liste vom Typ List<string> in T konvertieren. Nur wie konvertiere ich einen Typ in einen Generic T?

Gruß

Maruu

925 Beiträge seit 2004
vor 14 Jahren

Mal abgesehen davon, dass mir dein Ansatz nicht ganz klar ist... hast du's mal mit 'nem stinknormalen Cast versucht?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Maruu,

wenn du als T den Element-Typ angibst und als Rückgabe-Typ List<T> verwendest, bis du auf jeden Fall flexibler. Casten musst du wahrscheinlich trotzdem. Wenn es nicht direkt geht, dann erst nach Object und dann auf den Rückgabe-Typ casten.

herbivore

M
Maruu Themenstarter:in
121 Beiträge seit 2006
vor 14 Jahren

Ich erklär ganz kurz nochmal den Ansatz. Es sollen Programmeinstellungen gespeichert werden. Wie oben geschrieben hatte ich die Methode stark vereinfacht um es hier zu demonstrieren, hier etwas ausführlicher


public class AppData<T> where T : string, int, List<string>
{
   public void Speichern(string pName, T pWert)
   {
     ...
   }

   public T Laden(pName)
   {
      ...
   }

}

Mit diesem Ansatz hab ich nun eine Klasse mit der ich Einstellungen Laden und Speichern kann. Dabei kann ich über die Constraints (where T : string, int, List<string>) festlegen welche Datentypen gespeichert werden können und nur diese Datentypen muss ich dann in der Speichern- und Laden-Methode behandeln. Gespeichert wird in eine SQL CE Datenbank. Vorteil ist das ich das Speichern/Laden ganz leicht um einen weiteren Datentyp erweitern kann ohne großen Aufwand.

Mein Problem hat aber herbivore gelöst, ich muss erst auf object casten und dann auf T. Ich hatte immer versucht direkt die Liste auf T zu casten was leider nicht geht, so dieht also die Lösung aus:

return (T)((object)tmpListe);

Vielen Dank

Gruß

Maruu

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Maruu,

Es sollen Programmeinstellungen gespeichert werden.

dann verwende statt einer eigenen Lösung besser den Standard [Tutorial] Das neue Konfigurationsmodell im .NET Framework 2.0

herbivore

M
Maruu Themenstarter:in
121 Beiträge seit 2006
vor 14 Jahren

Die app.config is ja ganz nett, aber für mich hat sie einige Nachteile. Die Struktur meiner Datenbank ändert sich ab und zu mal. Es kommen neue Anforderungen also auch andere Spalten usw. Dies geschieht per Online-Update. Eine app.config zu ändern ist wirklich unschön, da es XML ist. Bei einer DB erstell ich 2-3 SQL-Statements und die Sache ist gegessen. Auserdem sehen Endbenutzer nicht ohne weiteres den Inhalt der Tabellen, bei einer App.config reicht ein handelsüblicher Editor um den kompletten Inhalt anzuzeigen.

Für Variable Daten wie z.B. einen Connectionstring kann eine app.config die passende Lösung sein. Ich bin jedoch der Meinung das sie für viele Dinge nicht optimal ist.

Gruß

Maruu

1.820 Beiträge seit 2005
vor 14 Jahren

Hallo!

Kurze Frage: Warum ist es so schlimm, wenn der bzw. die Benutzer Einblick in die Daten bekommen.

Alternativ könntest du die Einstellungen in einer eigenen Klasse speichern, diese per Reflection auslesen und sämtliche XML-Strukturen dynamisch erstellen.
Dann kannst du auch flexibler auf Änderungen reagieren.

Nobody is perfect. I'm sad, i'm not nobody 🙁

M
Maruu Themenstarter:in
121 Beiträge seit 2006
vor 14 Jahren

Naja wenn ich sensible Daten darin speicher, dann sollte die der Benutzer diese nicht sehen. Wenn ich z.B. eine Benutzerverwaltung in meinem Programm hab dann speicher ich Benutzernamen und Passworter (als Hash) in der DB. Dort kammt man (so leicht) nicht hin. In ner XML-Datei sieht man zumindest die Benutzernamen ohne Probleme. Ich weiß man kann XML auch verschlüsseln, aber da fängt es für mich schon wieder an kompliziert zu werden und mir fehlt der Mehrwert.

Zum Thema eigene Klasse und mit Reflection in XML wandeln. Das ist auch eine Möglichkeit. Nur hab ich hier ähnliche Probleme wie mit der app.config. Wenn sich an der Struktur meiner Reflection-Klasse etwas ändert, muss ich erst die Werte aus der alten Klasse auslesen, in eine neue Klasse schreiben und dann wieder das XML-schreiben. Außerdem muss ich per Reflection genauso verschiedene Datentypen behandeln, string, int, Listen usw. Gewonnen hab ich da gegenüber meiner Datenbank-Lösung nicht wirklich was.

Gruß

Maruu

1.820 Beiträge seit 2005
vor 14 Jahren

Hallo!

@Maruu:
Bei XML-Dateien und Serialisierung hat man u.a. den Vorteil, dass man die Namen der Properties mit entsprechenden Attributen markieren kann, um z.B. den XML-Tags einen anderen Namen zu geben. So kann die Property "Age" in XML "<Alter>" heißen.

Und bzgl. der sensiblen Daten reicht eine einfache symmetrische Verschlüsselung, damit die Informationen nicht mehr lesbar sind, da braucht es nicht gleich XML-Verschlüsselung zu sein.

Das Haupt-Problem, was ich letztendlich dabei sehe, ist die Tatsache, dass dein Programm sonst später beim Endbenutzer erst eine DB installieren muss (weil die nicht per Default auf normalen Systemen installiert ist), und so etwas stellt eine zusätzliche Fehlerquelle dar.

Und per Reflection hat man gerade den Vorteil, sich nicht um verschiedene Datentypen kümmern zu müssen. Man muss lediglich den Typ auslesen und z.B. als Attribut in das XML-Tag schreiben

Ich hab' mir mal ein paar Hilfsklassen geschrieben, mit denen kann ich mittlerweile komplexe Objekt-Hierarchien inkl. Kreisreferenzen schreiben und lesen.

Nobody is perfect. I'm sad, i'm not nobody 🙁

M
Maruu Themenstarter:in
121 Beiträge seit 2006
vor 14 Jahren

Die von Dir angefügten Punkte stimmen. Ich denke da hat einfach jeder seine Vorlieben und muss das nutzen was für Ihn besser passt. Ich hab früher die Daten auch per Reflection gespeichert, bin aber davon abgekommen da es für mich auf Dauer unpraktikabel war. Wie gesagt es kann manchmal passen, manchmal auch nicht.

Zum Thema DB. Wenn man eine verwendet die erst installiert werden muss dann sind das tatsächlich zusätzliche Fehlerquellen. Ich verwende aber den SQL Compact Server von MS. Der ist kostenlos und es bedarf keinerlei Installation. Ich muss lediglich 3-4 Dll's einbinden und das war's. Bisher hatte ich damit noch keine Probleme.

Gruß

Maruu

925 Beiträge seit 2004
vor 14 Jahren

Nur mal so... wäre das nicht eventuell interessant für dich?

http://www.codeproject.com/KB/vb/CustomSettingsProvider.aspx