Problem mit Typ-Argument

cr4shm4n

Mitglied
Hi,
Ich habe (stark verkürzt und schematisiert) diesen Code:
Code:
public class Klasse<T> {
private T ConvertBytes(byte[] b, int startIndex) {
      Type t = typeof(T);
      if (t == typeof(int)) return BitConverter.ToInt32(b, startIndex);
      // ... andere datentypen folgen
}
}
Dieser Code funktioniert natürlich nicht. Ich möchte also folgendes noch verbessern
  1. Beschränkung der Datentypen von Beginn an auf bool, short, int, long, float, double, char, string
  2. Lösung des Problems mit der Umwandlungsmethode (in der Zeile mit dem Return-Statement kommt natürlich ein Compilerfehler "Implizite Konvertierung nicht möglich"
Ich hoffe ihr habt da ein paar gute Ideen, ich schlag mich da schon eine ganze Zeit mit rum. ;)
 
Ich bin jetzt soweit, dass ich einen Lösungsansatz habe, allerdings habe ich dabei noch einige Probleme.
An die Zeile mit dem return-Statement habe ich einfach "as T" drangehängt. Das würde Funktionieren, wenn ich dann noch die Sache mit demType Parameter Contraint hinkriege.
@Norbert Eder: Soweit alles richtig, allerdings nicht ganz vollständig. Sonst würde die ganze Sache schon laufen ;)
Klassen als constraint funktionieren nur, wenn sie nicht sealed sind. Und das ist bei sämtlichen Klassen und Structs die ich oben aufgezählt habe, leider der Fall.
Damit besteht mein Problem nun darin, Den Code so umzubauen, dass ich die Beschränkung trotzdem nutzen kann.
Ich denke da an eine Art Wrapper-Klasse...
 
Hi

Ich glaub, das ist der einzige Weg das zu machen, was du möchtest:
http://brian.genisio.org/2008/06/generic-constraints-for-value-types.html

da:
MSDN hat gesagt.:
A constraint cannot be a value type, including built-in types such as int or double. Since value types cannot have derived classes, only one class would ever be able to satisfy the constraint. In that case, the generic can be rewritten with the type parameter replaced by the specific value type.
(http://msdn.microsoft.com/en-us/library/a174071k(VS.80).aspx)
 
Ich glaub, das ist der einzige Weg das zu machen, was du möchtest:
http://brian.genisio.org/2008/06/generic-constraints-for-value-types.html
Ich glaube nicht, denn ich bin soeben mit meiner eigenen Lösung fertig geworden. Ich hab mir die Lösung auf der verlinkten Seite nicht so genau angesehen, deshalb kann ich nicht sagen, ob meine aufwendiger war.
Die sah nämlich folgendermaßen aus:
Ich habe zunächst eine Leere Klasse, die nur dazu da ist, im Constraint zu stehen und vererbt zu werden.
C#:
public class MemoryScanner<T> where T : Value
und
C#:
    public class Value
    {
        public Value() { }
    }
Dazu kommt für jeden Werttyp, der implemetiert werden soll, eine Klasse nach folgendem Muster:
C#:
    public class IntVal : Value
    {
        public int Value;
        public static implicit operator IntVal(int value)
        {
            return new IntVal { Value = value };
        }
        public static bool operator ==(IntVal v1, int v2)
        {
            try { if (v1.Value == v2) return true; }
            catch { }
            return false;
        }
        public static bool operator !=(IntVal v1, int v2)
        {
            try { if (v1.Value != v2) return true; }
            catch { }
            return false;
        }
    }
Damit ist die Lösung auch recht gut erweiterbar.
Trotzdem danke für die Hilfe.
 

Klassen als constraint funktionieren nur, wenn sie nicht sealed sind. Und das ist bei sämtlichen Klassen und Structs die ich oben aufgezählt habe, leider der Fall.
Das hattest du ja nicht erwähnt.
 

Neue Beiträge

Zurück