2010-11-19 29 views
1

Bir nesneyi geçirdiğim parametreye eşit olup olmadığını kontrol eden basit bir dönüştürücüm var. Benim sorunum, dönüştürücü parametresinin her zaman dize olarak geçirilmesi ve değer her zaman nesne olarak geçirilmesidir. Bunları doğru bir şekilde karşılaştırmak için, parametreyi değerle aynı türde çevirmem gerekiyor. Bir nesnenin türünü, her iki türünü önceden bilmeden diğerinin türüne çevirebilmemin bir yolu var mı?Her iki nesneyi bilmeden bir nesneyi 2. nesnenin türüne dökmek mümkün mü?

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

Eğer hem "value" hem de "parameter" ifadesi tamsayı ise, iyi olmalıdır. Bunun bir örneği başarısız olur mu? –

+0

DönüştürücüParametreler dizeler olarak geçiyor, bu yüzden 0 girdiğimde "0" okuyor ve yanlış döndürülüyor. – Rachel

+0

Doğru - soruda bunu açıklığa kavuşturmak yararlı olacaktır. –

cevap

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

Bu yalnızca çalışacaktır zaman gerçek IConvertibleparameter değişken aletlerin tipi (ilkel türleri görür ve string):

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

Ve örnek kullanım şey gibi olurdu.

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

Ve tersi: Yani ilkel türlerine dize dönüşümleri yapacak

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 
      } 

Eğer tipleri değiştirirseniz:

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

Sonuçları almak için hangi pencereyi csharp> ... yazıyorsunuz? Bu F # stili penceresine benziyor. –

+0

Teşekkür ederim, bu harika çalışıyor! Önceden türlerimi bilmediğimden biraz değiştirilmiş bir sürüm kullandım (her zaman buraya girilen bir int/string değil) 'parameter = System.Convert.ChangeType (parameter, value.GetType());' – Rachel

+0

@Rachel: Tam olarak ilk kod bloğunda verdiğim kod değil mi? Son iki blok sadece 'ChangeType' davranışının örnekleri olarak düşünülmüştür. – cdhowie

0

Bu amaçla Yansımalar kullanmayı deneyebilirsiniz değişkenler, bu kod istisna atar ve 'uncastable' türlerini yapmaya çalıştığınızı fark eder.

+0

Bu kodun herhangi bir kısmı için 'System.Reflection'ı kullanmanız gerekmiyor' '. Ayrıca, 'a_type' elde edersiniz ve asla kullanmazsınız. – cdhowie

İlgili konular