2011-12-05 32 views
2

請看看下面的代碼:使用反射在運行時轉換類型?

 var val1 = ExtractValue(firstParam); 
     var val2 = ExtractValue(secondParam); 

     var type1 = val1.GetType(); 
     var type2 = val2.GetType(); 

     TypeConverter converter1 = TypeDescriptor.GetConverter(type1); 
     TypeConverter converter2 = TypeDescriptor.GetConverter(type2); 

     if (converter1 != null && converter1.CanConvertFrom(type2)) 
     { 
      var temp = converter1.ConvertFrom(val2); 
      return val1.Equals(temp); 
     } 
     return false; 

這對我來說是一個謎,當我用「INT」和枚舉對象試試這個代碼不返回true。我甚至在即時窗口中嘗試過「val1.Equals((int)(val2))」,結果是true,但converter1.CanConvertFrom(type2)仍然是false。

您能幫我解答嗎?有什麼我失蹤了嗎?

感謝

+0

Enum是int類型的,它們可以相互轉換。 – affan

+0

你假設每種類型都有一個[TypeConverter]。事實並非如此,只有少數人這樣做。 –

+1

@affan,Enum的默認支持類型是'int',但它不一定是;例如,它也可能很長,在這種情況下,它可能在分配給int時溢出。 –

回答

3

注意在documentation的言論:

如該類實現的,這個方法總是返回false。它永遠不會返回true

唯一一次你會得到一個不同的答案是如果你有一個TypeConverter的衍生物。但要注意的是,在框架很多TypeConverter的衍生物(比如BaseNumberConverter不會覆蓋CanConvertFrom是非常重要的。

6

廣義類型的轉換是相當差的和不一致的(在我看來)在.NET。不過,對於枚舉/ INT情況下,你可以使用IConvertible接口,或Convert相關的實用工具類:

int converted = (int)Convert.ChangeType(MyEnum.MyValue, typeof(int)); 

object converted = Convert.ChangeType(myValue, myExpectedType); 

作爲網站的音符,這個100%的免費庫在這裏:CodeFluentRuntimeClient有一個名爲ConvertUtilities的類,有一堆ChangeType方法重載(包括一個通用的),非常靈活和有用的類型轉換。

相關問題