У меня есть метод, который распаковывает примитивный тип на объект. Я хотел бы сделать его универсальным c методом для повышения производительности и сделать его более чистым - PullRequest
0 голосов
/ 14 января 2020

У меня есть метод, который распаковывает примитивный тип на объект. Я хотел бы сделать его универсальным c методом для повышения производительности и сделать его более чистым.

public object Getkey( IDataReader reader, Type fieldType)
{

if (fieldtype==typeof(Int64))
{
return reader.GetInt64(_keyFieldReaderIndex)
}
if (fieldType== typeof(Int16))
{
return reader.GetInt16(_keyFieldReaderIndex)
}
if (fieldType== typeof(float))
{
return reader.Getfloat(_keyFieldReaderIndex)
}
if (fieldType==typeof(byte))
{
return reader.Getbyte(_keyFieldReaderIndex)
}
if (fieldType== typeof(double))
{
return reader.Getdouble(_keyFieldReaderIndex)
}
if (fieldType== typeof(decimal))
{
return reader.Getdecimal(_keyFieldReaderIndex)
}
if (fieldType==typeof(DateTime))
{
return reader.GetDateTime(_keyFieldReaderIndex)
}
}

1 Ответ

3 голосов
/ 14 января 2020

В соответствии с вашими требованиями:

  1. Подпись метода public T Getkey<T>(IDataReader reader)
  2. Без упаковки / распаковки

Вы можете написать это так:

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 бизнес, и немного приятнее в использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...