none
Typen Vergleich bei Generischer Klasse RRS feed

  • Frage

  • Hallo,

    ich arbeite momentan in einem Windows Forms Projekt und habe eine generische Klasse, die verschiedene Datentypen speichern kann und je nach Datentyp dann unterschiedliche Control-Elemente auswirft. Also bei DateTime soll ein DatePicker zurückgegeben werden, bei string eine Textbox usw. 

    Soweit auch kein Problem, jedoch bei der Zuweisung des values bekomme ich immer einen Compiler-Error. 

    Hier ein kurzer Ausschnitt des Codes wo der Fehler auftaucht:

    public class instrElem<T>
    {
       private T _val;
       ....
    
    
       private void addCntrl ()
       {
          ---       
    if (_val.GetType()==typeof(DateTime))
           { 
              DateTimePicker cntrl = new DateTimePicker();
              cntrl.Value = (DateTime)_val;
           }
           ...
       }
    }

    Der Compiler meldet nun, dass er den Datentyp T nicht in DateTime umwandeln kann. Das ist ja soweit erstmal klar, weil ich ja durchaus unterschiedliche Datentypen als T haben kann. Aber in diesem Fall teste ich ja vorher den Datentyp und weiß dann genau, dass kein anderer Datentyp auftreten kann.

    Hat jemand eine Idee, wie man das Problem umgehen kann? Gibt es dafür einen vorgesehenen Befehl? Ich würde ungerne auf die generische Programmierung hier verzichten weil ich das ganze für diverse Datentypen habe und ansonsten sehr viel Code mehrfach hätte.

    Viele Grüße

    Felix

    EDIT: Ich konnte das Problem lösen indem ich Convert.ChangeType(_val,typeof(T)) verwendet habe.


    • Bearbeitet fcologne Montag, 16. Juli 2012 09:57 Lösung hinzugefügt
    Montag, 16. Juli 2012 08:24

Antworten

  • Hey,

    das Problem wird damit aber nicht gelöst. Welche Art von Klasse ich erzeugen muss weiß ich ja bereits, nur die Zuweisung des Values funktioniert so nicht.

    Ich habe das Problem jedoch jetzt gelöst indem ich Convert.ChangeType(_val,typeof(T)) verwende. Die Variante funktioniert ohne Probleme (Umwandlungsfehler können dort auch nicht auftreten da ich den Datentyp vorher genau prüfe).

    Und es handelt sich bei dieser Klasse um eine reine Designklasse, dort wird nur initialwert des Objekts gespeichert. Verarbeitungen o.ä. finden in der Klasse nicht statt. Jedoch ist die Erstellung der verschiedenen Typen von Controls sehr ähnlich, das für jede Control-Art extra zu machen würde sehr viel redundanten Code erzeugen.

    Gruß

    Felix 

    • Als Antwort markiert fcologne Montag, 16. Juli 2012 09:56
    Montag, 16. Juli 2012 09:56