我有一个简单的转换器,它检查对象是否等于我传递的参数。我的问题是转换器参数总是作为字符串传递,值总是作为对象传递。为了正确地比较它们,我需要将参数转换为与值相同的类型。有没有办法在不事先知道任何一种类型的情况下将一个对象的类型转换为另一个对象的类型?
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 :(得分: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
答案 1 :(得分:0)
您可以尝试使用Reflections来实现此目的:
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”类型。