转换& # 39;任何# 39;通过TypeConverters转换为字符串

本文关键字:转换 字符串 TypeConverters 通过 任何 | 更新日期: 2023-09-27 18:02:54

我试图创建一个实用程序方法,将任何任意类型的值转换为使用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;
        }
        ...

给定valuebool类型,targetTypestring类型,方法.CanConvertFrom()总是返回false。为什么不能从boolean值创建string呢?还是我遗漏了什么?

转换& # 39;任何# 39;通过TypeConverters转换为字符串

您正在反向使用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.
}

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