C# 是否可以在不知道任何一种类型的情况下将一个对象强制转换为第二个对象的类型?
我有一个简单的转换器,它检查一个对象是否等于我传递给它的任何参数。我的问题是转换器参数总是作为字符串传递,而值总是作为对象传递。为了正确地比较它们,我需要将参数转换为与值相同的类型。有没有一种方法可以将一个对象的类型强制转换为另一个对象的类型,而事先不知道这两种类型C# 是否可以在不知道任何一种类型的情况下将一个对象强制转换为第二个对象的类型?,c#,wpf,converter,C#,Wpf,Converter,我有一个简单的转换器,它检查一个对象是否等于我传递给它的任何参数。我的问题是转换器参数总是作为字符串传递,而值总是作为对象传递。为了正确地比较它们,我需要将参数转换为与值相同的类型。有没有一种方法可以将一个对象的类型强制转换为另一个对象的类型,而事先不知道这两种类型 public class IsObjectEqualParameterConverter : IValueConverter { public object Convert(object value, Type target
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}}" />
这仅在参数
变量的真实类型实现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
这仅在参数
变量的真实类型实现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
您可以尝试为此目的使用反射:
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”类型。您可以尝试为此使用反射:
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”类型。如果
value
和parameter
都是整数,则应该可以。你能举一个失败的例子吗?ConverterParameters作为字符串传递,所以当我输入0时,它将其读取为“0”并返回false。对-在问题中澄清这一点会很有帮助。@Jon Skeet:谢谢,我更新了我的问题如果value
和parameter
都是整数,应该可以。你能举一个失败的例子吗?ConverterParameters作为字符串传递,所以当我输入0时,它将其读取为“0”并返回false。对-这将有助于在问题中澄清这一点。@Jon Skeet:谢谢,我更新了我的问题您不需要使用System.Reflection代码>用于此代码的任何部分。此外,您获得a_type
并且从不使用它。您不需要使用System.Reflection代码>用于此代码的任何部分。此外,您还获得了一个_类型
,并且从不使用它。您在哪个窗口键入csharp>。。。为了得到结果而投入?那看起来像F风格的窗户。谢谢,效果很好!我使用了一个稍微修改过的版本,因为我事先不知道我的类型(在这里传递的不总是int/string)parameter=System.Convert.ChangeType(parameter,value.GetType())代码>@Rachel:这不正是我在第一个代码块中给你的代码吗?后两个块仅作为ChangeType
行为的示例。@myermian:这是Mono的交互式C#shell。是的,很抱歉,我赶时间,不知怎么错过了你回答的第一行。你在哪个窗口键入csharp>。。。为了得到结果而投入?那看起来像F风格的窗户。谢谢,效果很好!我使用了一个稍微修改过的版本,因为我事先不知道我的类型(在这里传递的不总是int/string)parameter=System.Convert.ChangeType(parameter,value.GetType())代码>@Rachel:这不正是我在第一个代码块中给你的代码吗?后两个块仅作为ChangeType
行为的示例。@myermian:这是Mono的交互式C#shell。是的,很抱歉我很忙,不知怎么错过了你答案的第一行