通过TypeConverters将“任何”转换为字符串

时间:2015-07-14 21:43:27

标签: c# .net reflection types type-conversion

我正在尝试创建一个实用程序方法,它使用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类型为booltargetType string,方法.CanConvertFrom()始终返回false。为什么不能从string值创建boolean?或者我在这里遗漏了什么?

2 个答案:

答案 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)

我不确切知道原因,但查看StringConverterhere)的来源

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.
}
  

作为奖励,我会抛出强制性的警告,即从一种类型到另一种类型的疯狂转换可能会导致爆炸,可能有更好的设计来实现你的目标等,等等。)