为什么以下代码无法编译?
如何基于泛型类型是“int”,“bool”,“char”等来创建调用适当的“BitConverter.GetBytes”重载的泛型方法?
更一般而言,如何创建基于泛型参数类型调用非泛型方法的泛型方法?

using System;

public class Test
{
    public static void Main()
    {
      var f = new Foo();
      f.GetBytes(10); // should call BitConverter.GetBytes(int);
      f.GetBytes(true); // should call BitConverter.GetBytes(bool);
      f.GetBytes('A'); // should call BitConverter.GetBytes(char);
    }
}

public class Foo
{
    public byte[] GetBytes <TSource> (TSource input)
    {
      BitConverter.GetBytes(input);
    }
}

最佳答案



通常,除非有问题的方法将System.Object作为参数,否则您不能这样做。问题在于,泛型并不仅限于方法调用参数所允许的类型。

您可以执行的最接近的操作是使用运行时绑定(bind):

public byte[] GetBytes <TSource> (TSource input)
{
     dynamic obj = input;
     BitConverter.GetBytes(obj);
}

这将方法绑定(bind)逻辑推到运行时,如果没有合适的方法要调用,则会抛出该异常。

关于c# - 如何使用泛型将参数传递给非泛型方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23251995/

10-11 13:15