我试图创建一个实用程序方法,将任何任意类型的值转换为使用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。为什么不能从boolean
值创建string
呢?还是我遗漏了什么?
您正在反向使用TypeConverter
。或者更确切地说,您试图在bool
:
string
TypeConverter
。var typeConverter = TypeDescriptor.GetConverter(targetType);
这为string提供了TypeConverter
,但是您希望转换的变量是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()
已经可以在几乎任何东西上工作了。
我不知道为什么,但是看看StringConverter
的源代码(这里)
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
if (sourceType == typeof(string)) {
return true;
}
return base.CanConvertFrom(context, sourceType);
}
对于除string之外的任何类型,它都遵循TypeConverter
基类;我无法让CanConvertFrom
为任何类型返回true !我不知道为什么会出现这种情况,但是你可以这样做:
try
{
var convertedValue = Convert.ChangeType(value,targetType);
return convertedValue;
}
catch(FormatException fex)
{
//can't convert for whatever reason.
}
作为奖励,我将抛出强制性警告,从一种类型到另一种类型的疯狂转换可能导致爆炸,可能有一个更好的设计来实现你的目标,等等:)