如何将Generic Type Argument的值转换为具体类型?

时间:2010-05-19 16:52:38

标签: c# .net generics

在确保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
        }
    }
}

虽然它通过装箱和拆箱工作,但这是一个额外的性能开销,如果有办法直接进行,我就会徘徊。

7 个答案:

答案 0 :(得分:15)

说实话,拳击和拆箱将成为最有效的方式。我不知道有什么方法可以避免拳击发生,任何其他形式的转换(例如Convert.ToInt32)都可能会执行你实际上并不想要的转换。

答案 1 :(得分:2)

Convert.ToInt32(value); 

应该这样做。

答案 2 :(得分:1)

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);
        }
    }
}

答案 3 :(得分:1)

int x = (dynamic)MyTest.Value;

我知道这是一个非常古老的线程,但这是实际的方法。 (dynamic)会将T值转换为运行时中任何原始已知类型。

答案 4 :(得分:0)

请参阅我对另一篇文章的回答:https://stackoverflow.com/a/26098316/1458303。它包含一个有效的类实现,可以避免在转换过程中装箱。

答案 5 :(得分:0)

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

OR

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

我可以获得int值。此处myobject的值为ObjectResult<Nullable<int>>

答案 6 :(得分:0)

以下方式应该有效。

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