2009-04-14 54 views
2

c#:我如何接受任何类型的数字作为参数的函数? 目前我的AddDataInt32()专门为Int32询问,但我如何接受任何数字,字节,整数签名或无符号,所以我可以将它传递给BitConverter.GetBytes()?它似乎傻写同一本功能对每种类型:(如何接受任何类型的数字作为参数在C#中的函数?

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

这里的用例是什么?你是否试图推出手动序列化代码?你也可以考虑protobuf-net,这可能为你节省很多时间。 – 2009-04-14 14:43:39

回答

4

你可以只重载方法...

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

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

等为每个号码类型。当您调用该过程时,它将采用您编码的任何形式的数字,并使用相同的过程名称。

2

嗯,你可以将其与反射和泛型自动化,但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

好的答案马克,但你可能会过度使用它? – 2009-04-14 14:43:13

+0

哦,绝对;-p – 2009-04-14 14:50:08

1
public void AddData(object data) 
{ 
} 

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

虽然我觉得我宁愿重载方法。

相关问题