2015-08-27 3 views
3

Я хочу обернуть BitConverter некоторыми дополнительными функциями. Но я не должен выписать все функции перегружать какфункция перегрузки обертки с помощью генераторов

BitConverter.GetBytes(int); 
BitConverter.GetBytes(double); 
... 

Есть ли способ, чтобы написать одну функцию шаблона, который оборачивает все перегрузку функции? как

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

ответ

3

Вы можете написать extension method для IEnumerable<byte> Я полагаю:

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); 
    } 
} 
3

Вы не можете сделать это с дженериков, так как разрешение BitConverter.GetBytes перегрузки потерпит неудачу, поскольку T может быть любого типа.

Вы можете сделать это с dynamic:

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

Это отложит разрешение перегрузки до выполнения. Конечно, это также подталкивает проверку типов, поэтому, если недопустимый тип использовался для значения, вы получите исключение во время выполнения вместо ошибки компилятора.

0

Вы можете использовать динамический тип

Прочитайте эту ссылку MSDN

Смежные вопросы