2010-11-19 21 views
1

J'ai un convertisseur simple qui vérifie si un objet est égal à n'importe quel paramètre je le passe. Mon problème est que le paramètre convertisseur est toujours passé en chaîne et que la valeur est toujours passée en objet. Pour les comparer correctement, je dois convertir le paramètre en le même type que la valeur. Existe-t-il un moyen de faire passer le type d'un objet au type d'un autre sans connaître préalablement les deux types?Est-il possible de lancer un objet dans le type d'un 2ème objet sans connaître l'un ou l'autre type?

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

Et un exemple d'utilisation serait quelque chose comme:

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

Si à la fois 'value' et' parameter' sont des entiers, ça devrait aller. Pourriez-vous donner un exemple d'échec? –

+0

ConverterParameters est passé en tant que chaînes, donc quand j'entre 0, il le lit comme "0" et retourne false. – Rachel

+0

Droit - il serait utile de le préciser dans la question. –

Répondre

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

Cela ne fonctionnera que lorsque le vrai type des variables parameter outils IConvertible (tous les types primitifs font, plus string). Donc, il va faire les conversions de chaînes à des types primitifs:

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

Et vice-versa:

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

Quelle fenêtre tapez-vous csharp> ... pour obtenir des résultats? Cela ressemble à la fenêtre de style F #. –

+0

Merci, ça marche super! J'ai utilisé une version légèrement modifiée car je ne connaissais pas mes types à l'avance (ce n'est pas toujours un int/string qui est passé ici) 'parameter = System.Convert.ChangeType (parameter, value.GetType());' – Rachel

+0

@Rachel: N'est-ce pas exactement le code que je vous ai donné dans le premier bloc de code? Les deux derniers blocs étaient destinés uniquement à titre d'exemples du comportement de 'ChangeType'. – cdhowie

0

Vous pouvez essayer d'utiliser réflexions à cet effet:

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 
      } 

Si vous changez de type des variables, ce code émet une exception et vous remarquez que vous avez essayé de lancer des types 'non-publiables'.

+0

Vous n'avez pas besoin de 'using System.Reflection;' pour toute partie de ce code. De plus, vous obtenez 'a_type' et ne l'utilisez jamais. – cdhowie