Я не знаю, зачем вам эта функция (и стоит ли это того, учитывая, что вы теряете безопасность времени компиляции), но вы можете попробовать это, чтобы удалить ненужные выделения в решении с помощью @ Mike Zboray :
public static T Parse<T>(BinaryReader reader)
{
return ReaderProvider<T>.ReaderFunc(reader);
}
class ReaderProvider<T>
{
public static readonly Func<BinaryReader, T> ReaderFunc;
static ReaderProvider()
{
MethodInfo mi ;
if(typeof(T) == typeof(byte))
{
mi = typeof(BinaryReader).GetMethod(nameof(BinaryReader.ReadByte));
}
else if(typeof(T) == typeof(int))
{
mi = typeof(BinaryReader).GetMethod(nameof(BinaryReader.ReadInt32));
}
// ....
else
{
throw new ArgumentOutOfRangeException($"{typeof(T).FullName}");
}
var p = Expression.Parameter(typeof(BinaryReader));
ReaderFunc = Expression.Lambda<Func<BinaryReader, T>>(Expression.Call(p, mi), p).Compile();
}
}
Пример использования:
var ms = new MemoryStream();
ms.Write(new byte[] { 1, 2, 0, 0, 0 }, 0, 5);
ms.Seek(0, SeekOrigin.Begin);
var x = new BinaryReader(ms);
Console.WriteLine(Parse<byte>(x));
Console.WriteLine(Parse<int>(x));
Также я настоятельно рекомендую использовать методы BinaryReader.ReadX
. Если это не подходит, то протестируйте производительность обеих реализаций.