C# 转换';任何事';通过类型转换器输入字符串

C# 转换';任何事';通过类型转换器输入字符串,c#,.net,reflection,types,type-conversion,C#,.net,Reflection,Types,Type Conversion,我试图创建一个实用方法,使用类型转换器将任意类型的值转换为另一种类型。但是,当尝试将某些内容转换为字符串时,TypeConverter总是失败 private bool TryConvertType(object value, Type targetType, out object result) { result = null; if(value == null) return false; try { if(targetType.I

我试图创建一个实用方法,使用
类型转换器将任意类型的值转换为另一种类型。但是,当尝试将某些内容转换为字符串时,
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;
        }
        ...

给定
作为类型
bool
targetType
字符串
,方法
.CanConvertFrom()
总是返回false。为什么不能从
布尔值创建
字符串
?还是我在这里遗漏了什么?

我不知道确切的原因,但正在查看
StringConverter
()

对于除字符串以外的任何类型,它都遵从基本的
TypeConverter
类;对于任何类型,我都无法让
CanConvertFrom
返回true!我不知道为什么会这样,但你可以一直这样做:

try
{
     var convertedValue = Convert.ChangeType(value,targetType);
     return convertedValue;
}
catch(FormatException fex)
{
    //can't convert for whatever reason.
}
作为奖励,我会强制性地提醒大家,疯狂地从一种类型转换到另一种类型可能会导致爆炸,可能会有更好的设计来实现你的目标,等等:)


我不知道确切的原因,但是查看
StringConverter
()

对于除字符串以外的任何类型,它都遵从基本的
TypeConverter
类;对于任何类型,我都无法让
CanConvertFrom
返回true!我不知道为什么会这样,但你可以一直这样做:

try
{
     var convertedValue = Convert.ChangeType(value,targetType);
     return convertedValue;
}
catch(FormatException fex)
{
    //can't convert for whatever reason.
}
作为奖励,我会强制性地提醒大家,疯狂地从一种类型转换到另一种类型可能会导致爆炸,可能会有更好的设计来实现你的目标,等等:)


您正在向后使用
TypeConverter
。或者,您正试图在
bool
上使用
string
TypeConverter

var typeConverter = TypeDescriptor.GetConverter(targetType);
这为字符串提供了
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()
几乎可以处理任何事情。

您正在向后使用
类型转换器。或者,您正试图在
bool
上使用
string
TypeConverter

var typeConverter = TypeDescriptor.GetConverter(targetType);
这为字符串提供了
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()
已经可以处理任何事情。

需要更多关于错误的信息。但是首先有一个问题.ToString()有什么问题?@BillRuhl错误很简单:TypeDescriptor不能从布尔值转换为字符串。(.CanConvertFrom()返回false)。没别的了。如您所见,UTILITY方法的思想是将任何值转换为另一种类型。我在这个例子中使用了字符串bool。。。同样,我也不确定您的后处理是什么,但C#已经完成了所有这些,如果对布尔值调用.ToString(),它将返回“true”或“false”。关于TypeDescriptor类本身不是很确定,但您面临的一个问题是内存分配。将布尔值转换为字符串是一件事,您只会得到true或false,但从字符串转换为布尔值将不起作用…需要有关错误的更多信息。但是首先有一个问题.ToString()有什么问题?@BillRuhl错误很简单:TypeDescriptor不能从布尔值转换为字符串。(.CanConvertFrom()返回false)。没别的了。如您所见,UTILITY方法的思想是将任何值转换为另一种类型。我在这个例子中使用了字符串bool。。。同样,我也不确定您的后处理是什么,但C#已经完成了所有这些,如果对布尔值调用.ToString(),它将返回“true”或“false”。关于TypeDescriptor类本身不是很确定,但您面临的一个问题是内存分配。将布尔值转换为字符串是一件事,您只会得到true或false,但从字符串转换为布尔值将不起作用…向后使用TypeConverter。人们怎么知道这是可能的呢?使用
StringConverter
boolean
转换为
string
对我来说就像使用
BooleanConverter
boolean
转换为
string
一样。当.NET开发人员设计令人困惑的API时,他们在想什么?不管怎样,它现在可以工作了,所以非常感谢你。弦是特别的。请记住,每个类型都有一个字符串表示形式。如果这不是真的,我们将无法在屏幕上显示它们。这就是为什么对象有一个ToString()函数。将这些“到字符串”的转换放在StringConverter中会使它成为一个非常大的类,并且一旦创建了一个新类,它就会过时。这些“到字符串”转换的正确位置在相关类型的TypeConverter中。在本例中,BooleanConverter.com将向后使用TypeConverter。人们怎么知道这是可能的呢?使用
StringConverter
boolean
转换为
string
对我来说就像使用
BooleanConverter
boolean
转换为
string
一样。当.NET开发人员设计令人困惑的API时,他们在想什么?不管怎样,它现在可以工作了,所以非常感谢你。弦是特别的。请记住,每个类型都有一个字符串表示形式。如果这不是真的,我们将无法在屏幕上显示它们。这就是为什么对象有一个ToString()函数。将这些“到字符串”的转换放在StringConverter中会使它成为一个非常大的类,并且一旦创建了一个新类,它就会过时。这些“到字符串”转换的正确位置是t