2010-11-19 196 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

相关问题