2010-09-21 76 views
2

我想在運行時使用反射來比較兩個值。我爲此使用了Comparer.Default.Compare(x,y),但我意識到這是不夠的。假設我想比較一個double(1.0 == 10)。 Comparer.Default會拋出一個異常,因爲它堅持這兩個值必須是相同的類型(double)。然而,這個存在明確的轉換,這真的是我想要使用的。使用反射的比較運算符

那麼,爲什麼我不能只使用Convert.ChangeType?以1.25> 1(double> integer)的情況。如果我嘗試1.25上的Convert.ChangeType(1.25,typeof(int)),我會得到1,並且上面的斷言將失敗,當真正的1.25 IS> 1時。

那麼,有人可以請建議一種調用顯式比較(如果存在)類型定義?

謝謝。

回答

5

你使用的是C#4和.NET 4嗎?如果是這樣,使用動態類型非常簡單:

dynamic x = firstValue; 
dynamic y = secondValue; 
if (x > y) // Or whatever 

編譯器會爲您執行所有適當的轉換。

+0

不錯的選擇!我總是忘記爲此使用動態。 – 2010-09-21 15:37:38

+0

我可以用表情樹做這個嗎? (.NET 2.0 + DLR是我的選擇,但4.0不是)我試圖發射一個快速調用,執行基本拉姆達比較Expression.Convert(Expression.Parameter(typeof(single)),typeof(double))在我的單個值上,但是在執行時失敗並且在執行時(無法編譯時)無效。我本來可以做錯的事情,因爲我只花了大約5分鐘的時間嘗試這個,然後不得不吃完午飯...... – Jeff 2010-09-21 21:17:40

+0

@ JeffN825:我認爲你需要爲自己制定正確的轉換。這不會很有趣。 – 2010-09-21 22:25:57

1

如果C#4是一個選項,Jon Skeet's suggestion of using dynamic是最有可能的理想選擇。

如果不是,則...

沒有明確的比較。編譯器在編譯時進行轉換,然後調用適當的比較。

最好的辦法是使用Convert.ChangeType轉換爲更寬的類型,然後對結果進行比較。如果您不想處理所有類型的檢查,則通常可以將雙方轉換爲decimal值,然後使用單個比較來檢查它們,因爲decimal應該充分處理所有值。

+0

謝謝......但我如何確定「更寬」的類型? – Jeff 2010-09-21 18:20:57

+0

@ JeffN825:你必須手動檢查它 - 這就是爲什麼我建議使用小數(因爲它總是寬/寬)。 – 2010-09-21 18:48:08

+0

雙數的最大值/最小值小於小數的情況如何? – Jeff 2010-09-21 19:02:30