2010-11-19 214 views
1

我有一個簡單的轉換器,它檢查一個對象是否等於我傳遞它的任何參數。我的問題是轉換器參數總是作爲字符串傳遞並且值始終作爲對象傳遞。爲了正確地比較它們,我需要將該參數強制轉換爲與該值相同的類型。有沒有一種方法可以將一個對象的類型轉換爲另一個對象的類型,而無需事先知道任何類型?是否可以在不知道任何類型的情況下將一個對象轉換爲第二個對象的類型?

public class IsObjectEqualParameterConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null && parameter == null) 
      return true; 

     if (value == null) 
      return false; 

     // Incorrectly returns False when the ConverterParameter is an integer 
     // Would like to try and cast parameter into whatever type value before checking equality 
     // Something like: return value.Equals((parameter as value.GetType())); 
     return value.Equals(parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

而且使用例子會是這樣的:

<Button IsEnabled="{Binding Path=Index, ConverterParameter=0, Converter={StaticResource IsObjectEqualParameterConverter}}" /> 
+0

如果'value'和'parameter'都是整數,那應該沒問題。你能舉出一個失敗的例子嗎? – 2010-11-19 20:08:16

+0

ConverterParameters作爲字符串傳遞,所以當我輸入0時,它將它讀作「0」並返回false。 – Rachel 2010-11-19 20:15:37

+0

正確 - 在問題中明確說明會很有幫助。 – 2010-11-19 20:17:51

回答

6
parameter = Convert.ChangeType(parameter, value.GetType()); 

這隻會工作時的真實類型的parameter變量工具IConvertible的(所有基本類型做,加上字符串)。所以它會做字符串轉換成基本類型:

csharp> Convert.ChangeType("1", typeof(int)); 
1 
csharp> Convert.ChangeType("1", typeof(int)).GetType(); 
System.Int32 

,反之亦然:

csharp> Convert.ChangeType(1, typeof(string)); 
"1" 
csharp> Convert.ChangeType(1, typeof(string)).GetType(); 
System.String 
+0

您打開csharp> ...進入哪個窗口以獲得結果?這看起來像F#樣式窗口。 – 2010-11-19 21:05:31

+0

謝謝,這很好!我使用了一個稍微修改過的版本,因爲我事先不知道我的類型(它並不總是一個int /字符串傳入此處)'parameter = System.Convert.ChangeType(parameter,value.GetType());'' – Rachel 2010-11-19 21:14:21

+0

@Rachel:這不就是我在第一個代碼塊中給出的代碼嗎?後兩個塊只是作爲'ChangeType'行爲的例子。 – cdhowie 2010-11-19 21:25:16

0

你可以嘗試使用思考這個目的:

using System.Reflection; 
int a = 10; 
      string str = "10"; 
      Type a_type = a.GetType(), str_type = str.GetType(); 
      try 
      { 
       if (Convert.ChangeType((object)a, str_type).Equals(str)) 
       { 

       } 
      } 
      catch (Exception ex) 
      { 
       //Can't to cast one type to other 
      } 

如果更改類型這段代碼拋出異常,並注意到你已經試圖轉換'uncastable'類型。

+0

你不需要使用System.Reflection;這個代碼的任何部分。此外,您獲得'a_type'並從不使用它。 – cdhowie 2010-11-19 20:39:00

相關問題