2010-05-19 169 views
11

我想泛型类型参数T值的值转换成整数,并确保T是在事实上整数后:如何将Generic Type Argument的值转换为具体类型?

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

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

+5

所以,让我明白这一点...你正在构造一个通用的方法,但它需要知道,如果类型参数是一个int?你的设计有问题。 – Will 2010-05-19 17:02:50

+0

任何不加重载的原因'void DoSomething(int value){}'? – 2010-05-19 17:07:51

+0

这是一个简化的例子。实际的代码有很多东西在转换之前和之后从泛型中受益 – 2010-05-19 17:26:59

回答

15

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

+0

谢谢你确认我对拳击/拆箱的想法。调用Convert Convert的速度确实会比较慢,因为调用的额外开销以及无论如何都会发生的装箱/拆箱:Convert.ToInt32(object value)会取对象,所以T会在此时被装箱,然后在某个时间点取消装箱。 – 2010-05-19 17:32:31

2
Convert.ToInt32(value); 

应该这样做。

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); 
     } 
    } 
} 
1
int x = (dynamic)MyTest.Value; 

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

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

OR

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

它的工作对我来说,得到int值。这里myobjectObjectResult<Nullable<int>>的值。

0

以下方法应该可以工作。

int x = (int)(value as int?); 
相关问题