もっと単純ですが、少し冗長性のある代替ソリューションが必要な場合は、ちょっと立ち上がってみてください。ここでの利点は、それが完全にtypesafeだということです。
ここでは、intとfloatの+と - の演算を実装するクイックダーティバージョンがあります。それを拡張してより多くの操作を含めるとともに、より多くのプリミティブ型(二重、十進数など)をサポートするか、それともカスタム型さえサポートすることは自明であるべきです。 GenericMathを必要なものに置き換えてください。
class Program
{
static void Main(string[] args)
{
var gsInt = new GenericMath<int,IntOperators>();
var gsFloat = new GenericMath<float,FloatOperators>();
var intX = gsInt.Sum(2, 3);
var floatX = gsFloat.Sum(2.4f, 3.11f);
}
}
interface IOperators<T>
{
T Sum(T a, T b);
T Difference(T a, T b);
}
sealed class IntOperators : IOperators<int>
{
public int Sum(int a, int b) { return a + b; }
public int Difference(int a, int b) { return a - b; }
}
sealed class FloatOperators : IOperators<float>
{
public float Sum(float a, float b) { return a + b; }
public float Difference(float a, float b) { return a + b; }
}
class GenericMath<T,Y>
where Y : IOperators<T>, new()
{
private readonly static Y Ops = new Y();
public T Sum(T a, T b)
{
return Ops.Sum(a, b);
}
public T Difference(T a, T b)
{
return Ops.Difference(a, b);
}
}
これは、現在のジェネリックの実装での残念な制限です。 Marcの実装は、問題を扱う際にも私が見てきた最高のものです。 connect.microsoft.comには、これに関するいくつかのサポート記事があります。それらはここで見つけることができます:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?Feedback=94264ここ:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID= 325177およびhttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=338861を参照してください。 – LBushkin
intを使用して動的を使用するつもりはありませんか? –
Doh - ありがとう、固定:) –