Duplicar posible:
Solution for overloaded operator constraint in .NET genericsDefinir un genérico que implementa el operador +
Tengo un problema que estoy trabajando, en la actualidad se está trabajando para int
s Pero lo quiero para trabajar para todas las clases que se pueden agregar usando el operador +
. ¿Hay alguna manera de definir esto en el genérico? Por ejemplo,
public List<T> Foo<T>() where T : ISummable
¿Hay alguna manera de hacer esto?
EDIT:
El rendimiento de pasar a un delegado para hacer la suma en lugar de usar + = con un tipo de Int fue un 540% más lento en el mejor de los casos. Investigando posible otra solución
Solución final:
Gracias a todos por sus sugerencias. Terminé con una solución que no es demasiado lenta e impone la verificación en tiempo de compilación. No puedo tomar todo el crédito ya que un colega me ayudó a llegar a esto. De todos modos, aquí está:
implementar una interfaz con todos los operadores necesarios en ella en forma de funciones
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);
}
Crear la clase que desea definir, pero en lugar de la cláusula WHERE, utilizar una instancia inyectada de dependencia de la interfaz IFoo. el OutputType generalmente será doble porque la naturaleza de las operaciones es matemática.
public class Bar<T>
{
private readonly IFoo<T,double> _operators;
public Bar(IFoo<T, double> operators)
{
_operators = operators;
}
}
ahora cuando se utiliza esta clase, se definen las reglas para la operación de la siguiente manera:
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);
}
}
allí tendría que utilizar de esta manera:
Foo inttoDoubleOperations = new Foo();
Bar myClass = new Bar(Foo);
de esa manera todas las operaciones se aplican en tiempo de compilación :)
enjoy!
No, no directamente. Sin embargo, hay un artículo sobre CodeProject que simula esto. – leppie
Gracias por su respuesta. ¿Me puede enviar un enlace a la solución? – TerrorAustralis
Por qué no tienen método en el ISummable que se pueden añadir dos T como T Agregar (T primera, T segundos)? Usando el operador + para la suma IMO involucraría el método de invocación de reflexión op_Addition. –
VinayC