Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中接受函数中任何类型的数字作为参数?_C#_.net - Fatal编程技术网

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

如何在C#中接受函数中任何类型的数字作为参数?,c#,.net,C#,.net,c#:我如何接受函数中任何类型的数字作为参数? 目前,我的AddDataInt32()专门要求输入Int32,但我如何接受任何数字、字节、有符号或无符号的整数,以便将其传递给BitConverter.GetBytes()?为每种类型编写相同的函数似乎很愚蠢:( 好的,您可以使用反射和泛型将其自动化,但是IMO重载是更好的选择-非常像您现有的代码 反射/泛型示例-尽管我并不推荐这种方法: static void Main() { byte[] bytes = GetBytes(123);

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


好的,您可以使用反射和泛型将其自动化,但是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);
        }
    }
}
static void Main()
{
byte[]bytes=GetBytes(123);
}
静态字节[]获取字节(T值){
返回Cache.func(值);
}
静态类缓存{
公共静态只读Func Func;
静态缓存(){
MethodInfo方法=类型(位转换器)
.GetMethod(“GetBytes”,新类型[]{typeof(T)});
if(方法==null){
func=委托{抛出新参数异常(
“+typeof(T.Name);}”没有GetBytes实现;
}否则{
func=(func)Delegate.CreateDelegate(
类型(Func),方法);
}
}
}
然后,您可以将其与调用
GetBytes
等的
AddData
通用方法混合使用

public void AddData(object data )
{
}

public void AddData(T数据)
{
}

虽然我想我更喜欢重载方法。

你可以重载这个方法

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

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

对于每一个数字类型,都有一个。当你对这个过程进行调用时,它将采用你所编码的任何形式的数字,同样的过程名称。< /P>贾景晖回答很好,但是你可能会超过它吗?这里的用例是什么?你在尝试手动序列化代码吗?你也可以考虑原Buffnet,它可以帮你节省一个LO。时间不多。嘿,这就是MS为BitConverter所做的,所以这可能是你最好的选择。我知道这是一个哈欠,但在我看来,这是最好的方法。这也是我首选的方法。
public void AddData<T>( T data )
{
}
public void AddData (Int32 i)
{...}

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