如何将泛型参数的值转换为具体类型?

12

我正在尝试将泛型类型参数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
        }
    }
}

尽管使用装箱和拆箱机制可以实现功能,但这会增加额外的性能开销。我想知道是否有一种直接执行此操作的方法。

5
所以,让我理解一下...你正在构建一个通用的方法,但它需要知道类型参数是否为int?你的设计有点问题。 - user1228
这只是一个简化的例子。实际代码在转换之前和之后有很多东西可以从泛型中受益。 - Aleksey Bieneman
T已经是int类型了,你为什么还要尝试进行强制转换呢?这没有任何意义。 - DevEstacion
2
@Will 在编程中,有很多情况下你需要一个通用方法,它对某些类型的子集表现出略微不同的行为,但仍然使用通用方法99%的通用逻辑。这种设计并没有任何问题。 - Slight
2
@有很多设计不良的坏案例,当然。这样的案例很多。 - user1228
显示剩余2条评论
7个回答

15

说实话,装箱和拆箱可能是这里最有效的方式。我不知道有任何避免发生装箱的方法,而且任何其他形式的转换(例如 Convert.ToInt32)都有可能执行您实际不想要的转换。


感谢您确认我的关于装箱/拆箱的想法。调用Convert确实会更慢,因为除了发生的装箱/拆箱之外,还有一个额外的调用开销:Convert.ToInt32(object value)接受对象,因此在此时T将被装箱,然后在稍后的某个时候进行拆箱。 - Aleksey Bieneman

2
Convert.ToInt32(value); 

应该这样做。


1
int x = (dynamic)MyTest.Value;

我知道这是一个非常古老的帖子,但这是实际的做法。 (dynamic) 将在运行时将 T 值转换为任何已知的基本类型。

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

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

或者

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

对我来说,获取int值是有效的。这里myobject具有ObjectResult<Nullable<int>>值。


0

0

以下方法应该可行。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接