C # Generics: Wie verwendet man x.MaxValue / x.MinValue (int, float, double) in einer generischen Klasse?

7

Ich verwende das WPF Extended Toolkit ( Ссылка ).

Es hat ein nettes NumericUpDown-Steuerelement, das ich gerne verwenden würde, aber intern verwendet es doubles - was bedeutet, dass es double.MinValue und double.MaxValue verwendet.

Ich würde gerne das gleiche Steuerelement verwenden, aber ich brauche eine generische Version - für ints muss es int.MaxValue / MinValue, für Floats float.MaxValue / MinValue, etc. verwenden (Ich denke, Sie bekommen die Idee: ))

Also habe ich das NumericUpDown in ein GNumericUpDown kopiert, wobei T natürlich der Typ sein würde. Dies funktioniert jedoch nicht, da ein generischer Type keinen MinValue / MaxValue hat. Und normalerweise würde ich die where-Klausel verwenden, um einen Basistyp anzugeben, aber das funktioniert nicht, da es keine gemeinsame Schnittstelle gibt, die 'MinValue' und 'MaxValue' definiert.

Gibt es eine Möglichkeit, dies mit Generika zu lösen, oder muss ich wirklich das ursprüngliche NumericUpDown für jeden Typ kopieren / einfügen / suchen und ersetzen?

    
Pygmy 11.12.2010, 19:53
quelle

4 Antworten

9

Der OP hat diesen Kommentar zu einer anderen Antwort gemacht:

  

Ich möchte diese Steuerelemente in meinem verwenden   XAML. Meine Idee war, ein Generikum zu erstellen   Version, und erstellen Sie dann leere Klassen   wie NumericUpDownInt:   GNumericUpDown {} Wäre das   der Weg zu gehen, oder ist da ein   besserer / sauberer Weg zu deinem Wissen

Wenn Sie diese Route gehen, übergeben Sie einfach die Min und Max direkt:

%Vor%     
Juliet 11.12.2010, 22:30
quelle
9

Nun, da Sie den Typ zur Ausführungszeit erreichen können, könnten Sie sich auf die Tatsache verlassen, dass alle numerischen Typen in .NET die Felder MinValue und MaxValue haben und lies sie mit Reflektion. Es wäre nicht besonders schön, aber einfach genug zu tun:

%Vor%

Beachten Sie, dass, wenn Sie dies mit einem unpassenden Typ verwenden, ich versucht habe, einen Fehler bei der Kompilierung so gut wie möglich zu erzwingen ... aber es wird nicht narrensicher sein. Wenn Sie es schaffen, eine Struktur mit den richtigen Schnittstellen zu finden, aber ohne MinValue und MaxValue Felder, dann wird jeder Versuch,% code_% mit diesem Typ zu verwenden, dazu führen, dass eine Ausnahme ausgelöst wird.

    
Jon Skeet 11.12.2010 19:56
quelle
2

Sie sollten den neuesten Quellcode für das erweiterte WPF-Toolkit erhalten. Mit dem aktualisierten NumericUpDown-Steuerelement können Sie angeben, welcher Datentyp im Editor verwendet werden soll. Der folgende Code gibt an, anstelle des Standarddoppelwerts Int32 als Datentyp zu verwenden. Wie Sie sehen, wird dies getan, indem die ValueType-Eigenschaft für das NumericUpDown-Steuerelement festgelegt wird.

%Vor%     
Brian Lagunas 17.12.2010 04:39
quelle
0

Da dies auch in Testszenarien nützlich ist:

Sie können Erweiterungsmethoden verwenden, so dass Sie in C # 6 (mit nameof ) schreiben könnten:

%Vor%

und durch einige zugegebenermaßen hässliche Syntax aufrufen:

%Vor%

was in Ihrer generischen Methode wäre

%Vor%

Beachten Sie, dass ich nicht sicher bin, dass alle primitiven Typen ihre Min / Max-Werte als Konstanten deklarieren. Verwenden Sie stattdessen GetValue .

    
Lorenz Lo Sauer 03.09.2016 04:39
quelle