2009-04-14 10 views
2

c#:関数に任意の種類の数値を引数として受け入れるにはどうすればよいですか? 現在私のAddDataInt32()は特にInt32を要求しますが、BitConverter.GetBytes()に渡すことができるように、どのように数字、バイト、intの符号付きまたは符号なしを受け入れることができますか?C#で引数として関数に任意の種類の数値を受け入れる方法はありますか?

public void AddDataInt32(Int32 i) 
{ 
    Data = ConcatTwoByteArrays(Data, BitConverter.GetBytes(i)); 
} 
+0

ここではユースケースとは何ですか?手動のシリアル化コードを表示しようとしていますか?また、protobuf-netを検討すると、時間を節約できます。 –

答えて

4

あなただけのメソッドをオーバーロードすることができます...

public void AddData (Int32 i) 
{...} 

public void AddData (Int16 i) 
{...} 

など各番号の種類の一つ。プロシージャを呼び出すと、同じプロシージャ名でコード化された任意の形式の番号が使用されます。

+0

+1 ...すべての10の過負荷のためにこれを行う必要があります... yawn .. –

+0

ちょっと、それはMSがBitConverterのためにしたものなので、おそらくあなたの最善の策です。 – Brian

+0

私はそれが夜明けであることを知っていますが、それは、今、最善の方法です。 –

2

さて、あなたは反射とジェネリックとそれを自動化することができ:(種類ごとに同じFUNCTのを書くために愚かなようだけど、IMOのオーバーロードは、より良い選択である - 。非常に多くの既存のコードのように

リフレクション/ジェネリック例 - 私は本当にこのルートをお勧めしませんが:

static void Main() 
{ 
    byte[] bytes = GetBytes(123); 
} 
static byte[] GetBytes<T>(T value) { 
    return Cache<T>.func(value); 
} 
static class Cache<T> { 
    public static readonly Func<T, byte[]> func; 
    static Cache() { 
     MethodInfo method = typeof(BitConverter) 
      .GetMethod("GetBytes", new Type[] { typeof(T) }); 
     if (method == null) { 
      func = delegate { throw new ArgumentException(
       "No GetBytes implementation for " + typeof(T).Name); }; 
     } else { 
      func = (Func<T, byte[]>)Delegate.CreateDelegate(
       typeof(Func<T, byte[]>), method); 
     } 
    } 
} 

あなたはその後、GetBytes<T>など

を呼び出す AddData<T>ジェネリックメソッドでそれを混ぜます
+0

ニースは答えますが、あなたはそれを過大にしているかもしれません。 –

+0

ああ、絶対に;-p –

1
public void AddData(object data) 
{ 
} 

または

public void AddData<T>(T data) 
{ 
} 

私はオーバーロードされたメソッドを好むと思いますが。

関連する問題