Как преобразовать значение Общего аргумента типа к конкретному типу?

Я пытаюсь преобразовать значение универсального параметра типа 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
        }
    }
}

Хотя это работает посредством упаковки и распаковывания, это - дополнительная производительность наверху, и я блуждал, если существует способ сделать это непосредственно.

11
задан Micha Wiedenmann 2 August 2017 в 11:42
поделиться

3 ответа

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

15
ответ дан 3 December 2019 в 06:20
поделиться
Convert.ToInt32(value); 

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

2
ответ дан 3 December 2019 в 06:20
поделиться

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);
        }
    }
}
1
ответ дан 3 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: