Estoy escribiendo una clase que hace esencialmente el mismo tipo de cálculo para cada uno de los tipos numéricos primitivos en C#. Aunque el cálculo real es más complejo, considérelo un método para calcular el promedio de una serie de valores, p.Código genérico C# y el operador Plus
class Calc
{
public int Count { get; private set; }
public int Total { get; private set; }
public int Average { get { return Count/Total; } }
public int AddDataPoint(int data)
{
Total += data;
Count++;
}
}
ahora para apoyar que la misma operación para el doble, flotador y tal vez otras clases que definen operador + y el operador /, mi primer pensamiento fue simplemente usar los genéricos:
class Calc<T>
{
public T Count { get; private set; }
public T Total { get; private set; }
public T Average { get { return Count/Total; } }
public T AddDataPoint(T data)
{
Total += data;
Count++;
}
}
Desafortunadamente C# es incapaz de determinar si T admite operadores + y/o no compila el fragmento de arriba. Mi siguiente pensamiento fue restringir T a los tipos que admiten esos operadores, pero mi investigación inicial indica que esto no se puede hacer.
Sin duda, es posible encasillar cada uno de los tipos que deseo admitir en una clase que implemente una interfaz personalizada, p. IMath y restrinja T a eso, pero este código se llamará una gran cantidad de veces y quiero evitar la sobrecarga del boxeo.
¿Existe una manera elegante y eficiente de resolver esto sin duplicación de código?
¿No puedes simplemente usar LINQ? Suma y promedio son compatibles con IEnumerable. – Mathias
Consulte esta otra pregunta ASÍ: http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers – spinon
@Mathias: No, utilicé esto como un ejemplo simplificado del cálculo real. –