Как преобразовать значение аргумента Generic Type в конкретный тип?

Я пытаюсь преобразовать значение значения параметра T типового типа в целое число, убедившись, что T фактически является целым числом:

public class Test
{
    void DoSomething<T>(T value)
    {
        var type = typeof(T);
        if (type == typeof(int))
        {
            int x = (int)value; // Error 167 Cannot convert type 'T' to 'int'
            int y = (int)(object)value; // works though boxing and unboxing
        }
    }
}

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

Ответ 1

Бокс и распаковка будут, пожалуй, самым эффективным способом здесь. Я не знаю, каким образом можно избежать появления бокса, и любая другая форма преобразования (например, Convert.ToInt32) потенциально будет выполнять конверсии, которые вам действительно не нужны.

Ответ 2

Convert.ToInt32(value); 

Должно это сделать.

Ответ 3

int и другие примитивы CLR реализуют IConvertible.

public class Test
{
    void DoSomething<T>(T value) where T : IConvertible
    {
        var type = typeof(T);
        if (type == typeof(int))
        {
            int y = value.ToInt32(CultureInfo.CurrentUICulture);
        }
    }
}

Ответ 4

int x = (dynamic)MyTest.Value;

Я знаю, что это очень старый поток, но это реальный способ сделать это. (dynamic) преобразует значение T в любой из примитивных известных типов во время выполнения.

Ответ 5

См. мой ответ на другое сообщение: fooobar.com/questions/465587/.... Он содержит эффективную реализацию класса, которая позволяет избежать бокса во время преобразования.

Ответ 6

int id = (dynamic)myobject.SingleOrDefault();

ИЛИ

int id = (int)myobject.SingleOrDefault();

Это помогло мне получить значение int. Здесь myobject имеет значение ObjectResult<Nullable<int>>.

Ответ 7

Следующий способ должен работать.

int x = (int)(value as int?);