Ответ: нет для методов, которые вы предоставляете.
Разработаны, например, C# и CTS of. NET, вы не можете избежать такой ошибки кодирования.
Но, тем не менее, вы можете использовать общий c метод вроде этого:
static T Read<T>(this T instance, List<byte> data)
{
switch ( instance )
{
case byte value:
Console.WriteLine("Read byte");
return default;
case UInt16 value:
Console.WriteLine("Read UInt16");
return default;
case UInt32 value:
Console.WriteLine("Read Uint32");
return default;
default:
string message = $"Type not supported for Read<T> (only byte or UInt16/32): "
+ $"{typeof(T).Name}";
throw new ArgumentException(message);
}
}
class Thing
{
public byte a { get; set; }
public UInt16 b { get; set; }
public UInt32 c { get; set; }
public byte d { get; set; }
public void Read(List<byte> data)
{
a = a.Read(data);
b = b.Read(data);
c = c.Read(data);
d = d.Read(data);
}
}
Это не дает абсолютного способа избежать ошибок кодирования, а делать меньше, потому что мы можем легко увидеть совпадение с переменной, с которой мы манипулируем, как при использовании строковых методов для изменения той же строки.
Тест
var list = new List<byte> { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
var instance = new Thing();
instance.Read(list);
Вывод
Read byte
Read UInt16
Read Uint32
Read byte