В соответствии с вашими требованиями:
- Подпись метода
public T Getkey<T>(IDataReader reader)
- Без упаковки / распаковки
Вы можете написать это так:
public T M<T>(IDataReader reader)
{
if (typeof(T) == typeof(long))
{
long result = reader.GetInt64(_keyFieldReaderIndex);
return Unsafe.As<long, T>(ref result);
}
if (typeof(T) == typeof(short))
{
short result = reader.GetInt16(_keyFieldReaderIndex);
return Unsafe.As<short, T>(ref result);
}
// etc...
}
(Вам понадобится пакет System.Runtime.CompilerServices.Unsafe
NuGet, если вы не используете. NET Core.)
Однако Я не уверен, что это разумная вещь. Предположительно у вас есть какой-то код, который выполняет:
bool result = GetKey<bool>(reader);
Почему бы просто не изменить этот код следующим образом:
bool result = reader.GetBoolean(_keyFieldReaderIndex);
Если это не удастся, я бы предпочел выписать кучу вспомогательных методов, таких как:
public bool GetBoolean(IDataReader reader) => reader.GetBoolean(_keyFieldReaderIndex);
Это будет значительно короче (одна строка на тип, в отличие от 5 строк на тип, если вы используете метод generi c выше), избегает Unsafe
бизнес, и немного приятнее в использовании.