我想在這裏實現的是盒裝原始類型的直接值比較。盒裝值類型比較
((object)12).Equals((object)12); // Type match will result in a value comparison,
((object)12).Equals((object)12d); // but a type mismatch will not. (false)
object.Equals((object)12,(object)12d); // Same here. (false)
我明白'爲什麼'。我只是看不到'如何'。
這些類型直到運行時才知道,它們可以是數據源中的任何基本類型。包括字符串,日期時間,布爾等等。 我寫下了一個擴展方法,寫出了這兩種類型的醜惡路線,然後在進行'=='比較之前進行投射:(爲了完整性,我包含了每一個原語類型,再加上那些我感興趣的是)
public static bool ValueEquals(this object thisObj, object compare)
{
if (thisObj is int)
{
int obj = (int)thisObj;
if (compare is int)
return (obj == (int)compare);
if (compare is uint)
return (obj == (uint)compare);
if (compare is decimal)
return (obj == (decimal)compare);
if (compare is float)
return (obj == (float)compare);
<... and so on for each primitive type ...>
}
if (thisObj is uint)
{
uint obj = (uint)thisObj;
if (compare is int)
return (obj == (int)compare);
if (compare is uint)
return (obj == (uint)compare);
<... Again for each primitive type ...>
}
if (thisObj is decimal)
{
decimal obj = (decimal)thisObj;
if (compare is int)
return (obj == (int)compare);
<... Etc, etc ...>
產生的方法竟然是300條多線長,這是很好的(但醜陋的),但現在我需要做的不僅僅是「==」更多。我需要>,<,< =,> =,!=。
有什麼反射,我可以使用盒裝值類型比較?
什麼都可以嗎?
所以你只是想能夠比較兩個可能包含相同值的UNLIKE盒裝值?你不需要Equals(),因爲大多數不同類型的比較返回false。我會嘗試類似... –
請改用C#4.0 * dynamic *關鍵字。 –
我會避免動態,因爲你更容易出現運行時問題。通過下面的解決方案,您至少會知道這兩種類型在編譯時都是可以轉換的,並且避免了很多運行時錯誤。 –