如何在C#中接受任何类型的数字作为参数?

时间:2009-04-14 14:35:07

标签: c# .net

c#:我如何接受任何类型的数字作为参数? 目前我的AddDataInt32()专门请求Int32,但我如何接受任何数字,字节,整数有符号或无符号,所以我可以将它传递给BitConverter.GetBytes()?为每种类型编写相同的函数似乎很愚蠢:(

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

3 个答案:

答案 0 :(得分:4)

你可以重载方法......

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

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

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

答案 1 :(得分: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);
        }
    }
}

然后,您可以将其与调用AddData<T>等的GetBytes<T>通用方法混合使用。

答案 2 :(得分:1)

public void AddData(object data )
{
}

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

虽然我认为我更喜欢重载方法。