2014-02-14 51 views
-3

我有一個函數,它接受兩個通用對象輸入,將第二個對象轉換爲第一個,然後比較這兩個對象。比較任意類型的兩個對象的等價性

功能:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    object parameterCast = System.Convert.ChangeType(parameter, value.GetType()); 

    return parameterCast.Equals(value); 
} 

我認爲有幾個與這一點,我不知道如何解決問題,但是。

第一個是,如果該參數不能轉換爲值,該怎麼辦?

其次,我是否需要檢查每個對象是否爲空?如果是這樣,怎麼樣?

有沒有人有任何建議或建議修改此功能?

任何幫助非常感謝,謝謝。

+4

這個函數沒有泛型。 –

+0

並且查看[System.Convert.ChangeType](http://msdn.microsoft.com/en-us/library/ttf5d382%28v=vs.110%29.aspx)的MSDN文檔也有幫助。如果不支持轉換,它將引發InvalidCastException。 – Dirk

+0

@TimRogers是的,對不起。當我寫這些時,我並沒有真正想到,我的意思是泛型,它只是一個普通對象,我不知道類型。 – djcmm476

回答

1

我不知道你需要一個單獨的方法 。你會提供一些你打算如何使用這個方法的例子嗎?

至於修改函數,您的示例代碼不使用targetTypeculture參數。此外,你的函數的名字很混亂,因爲它的返回值是Equals方法的結果。

而不是使用該方法,您可能可以使用parameter == (ParameterTargetType)value,但無法將對象轉換爲任意類型或類,因此您需要實現某種方式來執行此操作,或者使用try ... catch ...語句來處理可能的轉換異常。

哦,是的,要檢查一個對象是否爲空,只需使用object == null。隨着if聲明,你可以寫:

if (value == null) 
{ 
    // Do something if the 'value' object is null. 
} 

一般來說,在C#中函數調用的方法。他們總是(?)在函數是類的成員時。

+0

太好了,謝謝。我現在就放棄它。格式類型必須保持不變,因爲整個代碼的結構(調用它們的轉換器也讓我感到有點不安)。儘管我很清楚方法和功能之間的區別,但很高興知道我應該使用什麼。 – djcmm476

2

準確的方式來檢查,如果value爲null是

if (Object.ReferenceEquals(null, value)) { 
    // value is null 
    ... 
    } 

其他流行的方式

// == operartor can be implemented explicitly 
    if (value == null) {...} 

    // Equals method could be overriden 
    if (Object.Equals(null, value)) {...} 

可能是不正確,因爲Equals方法和/或== operator重寫/重新標記

+0

對於使用'=='的'value == null'? –

+1

「public static Boolean operator ==(ValueClass left,ValueClass right){...}」其中ValueClass是一個值的類,如果聲明該運算符 –

+0

所以'null == value'相當於您的「最準確的方式」 ? –

1

這將檢查引用是否指向相同的東西,然後檢查是否爲空,你可以返回你想要的。之後你可以施放,然後比較這兩者是否都通過。

if (System.Object.ReferenceEquals(lhs, rhs)) 
{ 
    return true; 
} 
if (System.Object.ReferenceEquals(lhs, null) || System.Object.ReferenceEquals(rhs, null)) 
{ 
    return false; 
} 

但是我會考慮實際使用通用函數。像這樣的東西應該工作。如果as TData失敗,則該對象將返回null(如果未返回等於操作)。

public object Convert<TData>(TData value, object parameter, System.Globalization.CultureInfo culture) 
     where TData : class 
    { 
     TData convertedObject = parameter as TData; 
     if (convertedObject == null) 
      return false; 
     else 
      return value == convertedObject; 
    } 

雖然未經測試。