2010-05-19 168 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?); 
相關問題