我正在尝试创建一个实用程序方法,它使用TypeConverter
将任意任意类型的值转换为另一种类型。但是,在尝试将某些内容转换为字符串时,TypeConverter
始终会失败。
private bool TryConvertType(object value, Type targetType, out object result) {
result = null;
if(value == null)
return false;
try {
if(targetType.IsInstanceOfType(value)) {
result = value;
return true;
}
var typeConverter = TypeDescriptor.GetConverter(targetType);
if(typeConverter.CanConvertFrom(value.GetType())) {
result = typeConverter.ConvertFrom(value);
return true;
}
...
鉴于value
类型为bool
,targetType
string
,方法.CanConvertFrom()
始终返回false。为什么不能从string
值创建boolean
?或者我在这里遗漏了什么?
答案 0 :(得分:3)
您向后使用TypeConverter
。或者更确切地说,您正试图在string
上使用TypeConverter
bool
:
var typeConverter = TypeDescriptor.GetConverter(targetType);
这为您提供了TypeConverter
字符串,但您要转换的var是bool
。您还希望使用CanConvertTo
/ ConvertTo
进行实际转换:
// get bool type TypeConverter
var typeConverter = TypeDescriptor.GetConverter(value.GetType());
// can it convert a bool to string?
if (typeConverter.CanConvertTo(targetType))
{
// joy!
result = typeConverter.ConvertTo(value, targetType);
return true;
}
测试代码:
if (TryConvertType(b, t, out result))
Console.WriteLine(result.ToString());
输出:
真
当然,ToString()
已经适用于任何事情。
答案 1 :(得分:2)
我不确切知道原因,但查看StringConverter
(here)的来源
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
if (sourceType == typeof(string)) {
return true;
}
return base.CanConvertFrom(context, sourceType);
}
它除了字符串之外的所有类型都推迟到基类TypeConverter
类;对于任何类型,我都无法让CanConvertFrom
返回true!我不知道为什么就是这种情况,但你总是可以这样做:
try
{
var convertedValue = Convert.ChangeType(value,targetType);
return convertedValue;
}
catch(FormatException fex)
{
//can't convert for whatever reason.
}
作为奖励,我会抛出强制性的警告,即从一种类型到另一种类型的疯狂转换可能会导致爆炸,可能有更好的设计来实现你的目标等,等等。)