15 Stimmen

Wie schreibe ich eine Erweiterungsmethode für einen generischen Typ mit Beschränkungen für Typparameter?

Ich arbeite mit einer aufgabenspezifischen .NET-Plattform, die vorkompiliert und nicht OpenSource ist. Für einige Aufgaben muss ich diese Klasse erweitern, aber nicht durch Erben von ihr. Ich möchte einfach eine Methode hinzufügen.

Zunächst möchte ich Ihnen eine bestehende Klasse mit Dummycode zeigen:

public class Matrix<T> where T : new() {
    ...
    public T values[,];
    ...
}

Ich möchte diese Klasse auf die folgende Weise erweitern:

public static class MatrixExtension {
    public static T getCalcResult<T>(this Matrix<T> mat) {
        T result = 0;
        ...
        return result;
    }
}

Ich habe diese Syntax aus vielen Google-Links, also keine Ahnung, ob sie korrekt ist. Der Compiler sagt mir keinen Fehler, aber am Ende funktioniert es nicht. Am Ende möchte ich diese Funktion auf die folgende Weise aufrufen:

Matrix<int> m = new Matrix<int>();
...
int aNumber = m.getCalcResult();

Hat jemand eine Idee? Vielen Dank für Ihre Hilfe!

Mit freundlichen Grüßen Nem

23voto

Mark Cidade Punkte 95914

Sie müssen der Erweiterungsmethode die gleichen Typparametereinschränkungen hinzufügen.

Dies ist mein Versuch einer möglichst genauen Rekonstruktion Ihres Beispiels, das sich kompilieren lässt und ohne Fehler läuft:

public class Matrix<T>  where T : new() {
     public T[,] values;
 }

 public static class MatrixExtension {
     public static T getCalcResult<T>(this Matrix<T> mat)  where T : new() {
         T result = new T();
         return result;
     }
 }

 class Program {
     static void Main(string[] args)  {
        Matrix<int> m = new Matrix<int>();
        int aNumber = m.getCalcResult();
        Console.WriteLine(aNumber); //outputs "0"
 }

2voto

Reed Copsey Punkte 536986

Im Moment ist der einzige "Fehler", den ich sehen würde, dieser:

T result = 0;

Sie könnten das ändern in:

T result = default(T);

Im Falle von Werttypen ist dieser Wert gleich Null, so dass es sicher wäre.

Sie werden jedoch feststellen, dass dies schwierig ist, wenn Sie zu dem Abschnitt "..." gelangen, den Sie aufgelistet haben. Die Grundtypen ( int , double usw.) implementieren keine Methode, mit der Sie Ihre Berechnungen durchführen können. Dies ist eine lange Zeit, sehr hoch bewertete Anfrage auf Connect Übrigens.

Es gibt zwar Umgehungsmöglichkeiten, aber sie machen das Leben sehr schwer. Im Gegensatz zu Templates in C++ unterstützen die Generics von C# keine typsicheren mathematischen Operationen für beliebige Typen.

-2voto

DRapp Punkte 45486

Haben Sie sich über "Dekorateure" informiert...

Muster mit Dekorationsmustern

Mit einem Dekorator können Sie eine Klasse mit eigenen Eigenschaften und Methoden erstellen, ohne eine direkte Ableitung von einer bestimmten Klasse vorzunehmen. Dann können Sie sie auf praktisch JEDES andere Objekt "anwenden". Dann können Sie Ihre zusätzlichen Methoden oder Eigenschaften verwenden, mit denen Sie arbeiten möchten.

Bei diesem Beispiel handelt es sich um einen einfachen Schnellfund, der zeigt, wie ein solches Beispiel an "Autos" angehängt wird, indem "Optionen" gebaut werden...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X