2010-11-19 3 views
1

私は、オブジェクトが渡すパラメータと等しいかどうかをチェックする簡単なコンバータを持っています。私の問題は、コンバータパラメータは常に文字列として渡され、値は常にオブジェクトとして渡されるということです。それらを適切に比較するには、パラメータを値と同じ型としてキャストする必要があります。いずれかの型を事前に知らなくても、あるオブジェクトの型を別の型の型にキャストする方法はありますか? parameter変数の本当のタイプはIConvertible(すべてのプリミティブ型が行う、プラスの文字列)を実装する場合にのみ動作しますいずれかのタイプを知らなくても、1つのオブジェクトを2番目のオブジェクトのタイプにキャストすることは可能ですか?

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

'value'と' parameter'の両方が整数であれば、それは問題ありません。それが失敗した例を教えてください。 –

+0

ConverterParametersは文字列として渡されます。したがって、0を入力すると、それが「0」として読み込まれ、falseが返されます。 – Rachel

+0

そうですね、質問ではそれを明確にすることが役に立ちます。 –

答えて

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

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(); 
    } 
} 

そして例の使用はようなものになるだろう。だから、プリミティブ型に文字列変換を行います。

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

およびその逆:

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 
      } 

あなたはタイプを変更する場合:

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

結果を得るためにどのウィンドウにcsharp> ... intoと入力していますか? F#スタイルのウィンドウのように見えます。 –

+0

ありがとう、それは素晴らしい作品!私は事前に自分の型を知らなかったので少し修正されたバージョンを使用しました。(これは必ずここに渡されるint/stringではありません) 'parameter = System.Convert.ChangeType(parameter、value.GetType());' – Rachel

+0

@Rachel:最初のコードブロックで私があなたに与えたコードとまったく同じではありませんか?後者の2つのブロックは、 'ChangeType'の動作の例としてのみ意図されていました。 – cdhowie

0

をあなたは、この目的のために反射を使用しようとすることができ変数のうち、このコードは例外をスローし、あなたが 'キャスト不可能な'型をキャストしようとしたことに気付きました。

+0

このコードのどの部分にも 'using System.Reflection;'は必要ありません。さらに、 'a_type'を取得して使用することはありません。 – cdhowie

関連する問題