変更できない外部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。呼び出し元のクラスがジェネリックである場合に、非ジェネリッククラスのメソッドに最も具体的なオーバーロードを使用させる方法はありますか?