Mögliches Duplikat:
Lösung für überladene Operator-Beschränkung in .NET Generika
Ich habe ein Problem, an dem ich gerade arbeite, und zwar für int
s, aber ich möchte, dass es für alle Klassen funktioniert, die mit der Option +
Betreiber. Gibt es eine Möglichkeit, dies im generischen Text zu definieren? Zum Beispiel,
public List<T> Foo<T>() where T : ISummable
Gibt es eine Möglichkeit, dies zu tun?
EDIT :
Leistung der Übergabe in einem Delegaten, um die Summierung zu tun, anstatt mit += mit einem Typ von Int war 540% langsamer bestenfalls. Untersuchung der möglichen anderen Lösung
Endgültige Lösung:
Ich danke Ihnen allen für Ihre Vorschläge. Ich habe eine Lösung gefunden, die nicht zu langsam ist und die Überprüfung zur Kompilierzeit durchsetzt. Ich kann nicht den ganzen Ruhm für mich beanspruchen, da mir ein Kollege dabei geholfen hat, diese Lösung zu finden. Wie auch immer, hier ist sie:
Implementierung einer Schnittstelle mit allen erforderlichen Operatoren in Form von Funktionen
public interface IFoo<InputType, OutputType>
{
//Adds A to B and returns a value of type OutputType
OutputType Add(InputType a, InputType b);
//Subtracts A from B and returns a value of type OutputType
OutputType Subtract(InputType a, InputType b);
}
Erstellen Sie die Klasse, die Sie definieren möchten, aber verwenden Sie anstelle der Where-Klausel eine Instanz der IFoo-Schnittstelle, die in die Abhängigkeit injiziert wird. Der OutputType wird meistens double sein, da die Art der Operationen mathematisch ist.
public class Bar<T>
{
private readonly IFoo<T,double> _operators;
public Bar(IFoo<T, double> operators)
{
_operators = operators;
}
}
Wenn Sie nun diese Klasse verwenden, definieren Sie die Regeln für den Betrieb wie folgt:
private class Foo : IFoo<int, double>
{
public double Add(int a, int b)
{
return (double)(a+b);
}
public double Subtract(int a, int b)
{
return (double)(a-b);
}
}
dann würden Sie es so verwenden:
Foo inttoDoubleOperations = new Foo();
Bar myClass = new Bar(Foo);
auf diese Weise werden alle Operationen zur Kompilierzeit erzwungen :)
Viel Spaß!