変更できない外部APIとインターフェイスするコードを書いています。
public class ExternalAPI
{
public static void Read(byte[] buffer);
public static void Read(int[] buffer);
public static void Read(float[] buffer);
public static void Read(double[] buffer);
}
にデータを読み込むときに正しいオーバーロードされたメソッドを呼び出すことが重要ですbuffer
が、データが読み込まれると、一般的に処理します。それを行うコードでの私の最初のパスは次のとおりです。
public class Foo<T>
{
T[] buffer;
public void Stuff()
{
ExternalAPI.Foo(buffer);
}
}
ただし、C#はからT[]
に変換されませんbyte[]
。T
明示的に表すことができるタイプを列挙する方法はありますか?句を使ってみましたwhere T :
が、言う方法がないようwhere T : {byte, int, float, double and nothing else ever}
です。
ここでのアドバイスに従って:数値型に一致するジェネリック制約、ジェネリックobject
に制約を追加し、パラメーターとしてをとるシミュレートされたAPIにジェネリックメソッドも追加しました
public class ExternalAPI
{
public static void Read(object buffer);
public static void Read(byte[] buffer);
public static void Read(int[] buffer);
public static void Read(double[] buffer);
}
public class Foo<T> where T: struct, IComparable, IComparable<T>, IConvertible, IEquatable<T>, IFormattable
{
T[] buffer;
public void Stuff()
{
ExternalAPI.Read(buffer);
}
}
Foo(object buffer)
これはコンパイルされて正常に実行されますが、がである場合でも、これまでに呼び出される唯一のメソッドT
はですbyte
。呼び出し元のクラスがジェネリックである場合に、非ジェネリッククラスのメソッドに最も具体的なオーバーロードを使用させる方法はありますか?