如何将Generic Type Argument的值转换为具体类型?
问题描述:
我想泛型类型参数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
}
}
}
虽然它的工作原理通过装箱和拆箱,这是一个额外的性能开销,如果有办法直接做,我就会徘徊。
答
拳击和拆箱在这里将是最有效的方式,说实话。我不知道有什么避免发生拳击的方法,并且任何其他形式的转换(例如Convert.ToInt32)都可能会执行您实际上不需要的转换。
+0
谢谢你确认我对拳击/拆箱的想法。调用Convert Convert的速度确实会比较慢,因为调用的额外开销以及无论如何都会发生的装箱/拆箱:Convert.ToInt32(object value)会取对象,所以T会在此时被装箱,然后在某个时间点取消装箱。 – 2010-05-19 17:32:31
答
Convert.ToInt32(value);
应该这样做。
答
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);
}
}
}
答
int x = (dynamic)MyTest.Value;
我知道这是一个非常老的线程,但这是实际的方法。 (dynamic)
将在运行时将T值转换为任何原始已知类型。
答
int id = (dynamic)myobject.SingleOrDefault();
OR
int id = (int)myobject.SingleOrDefault();
它的工作对我来说,得到int
值。这里myobject
有ObjectResult<Nullable<int>>
的值。
答
以下方法应该可以工作。
int x = (int)(value as int?);
所以,让我明白这一点...你正在构造一个通用的方法,但它需要知道,如果类型参数是一个int?你的设计有问题。 – Will 2010-05-19 17:02:50
任何不加重载的原因'void DoSomething(int value){}'? – 2010-05-19 17:07:51
这是一个简化的例子。实际的代码有很多东西在转换之前和之后从泛型中受益 – 2010-05-19 17:26:59