【问题标题】:wrap overloading function with generics用泛型包装重载函数
【发布时间】:2015-08-27 18:51:52
【问题描述】:

我想用一些额外的功能来包装 BitConverter。但是我不必像

那样写出所有的重载函数
BitConverter.GetBytes(int);
BitConverter.GetBytes(double);
...

有没有办法编写一个包装所有重载函数的模板函数?喜欢

void GetBytes <T> (List<byte> byteList, T value) 
{
    ....
    byte[] result = BitConverter.GetBytes(value);
    byteList.AddRange(result);
    return;
}

【问题讨论】:

    标签: c# generics overloading


    【解决方案1】:

    我想你可以为IEnumerable&lt;byte&gt; 写一个extension method

    class Program
    {
        static void Main(string[] args)
        {
            var target = new List<byte>();
            BitConverter.GetBytes(10).AddBytesToTarget(target);
            BitConverter.GetBytes(100d).AddBytesToTarget(target);
        }
    }
    
    static public class Extensions
    {
        public static void AddBytesToTarget(this IEnumerable<byte> bytes, List<byte> target)
        {
            target.AddRange(bytes);
        }
    }
    

    【讨论】:

      【解决方案2】:

      由于T 可以是任何类型,重载解析BitConverter.GetBytes 将失败,因此不能使用泛型。

      您可以使用dynamic

      void GetBytes(List<byte> byteList, dynamic value) {
          ....
          byte[] result = BitConverter.GetBytes(value);
          byteList.AddRange(result);
      }
      

      这会将重载决议推迟到运行时。当然,这也推动了类型检查,因此如果将无效类型用于值,您将得到运行时异常而不是编译器错误。

      【讨论】:

        【解决方案3】:

        你可以使用动态类型

        阅读MSDN的链接

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-23
          • 1970-01-01
          • 2018-02-23
          • 2016-05-28
          • 1970-01-01
          相关资源
          最近更新 更多