将字符串“1”或“0”转换为bool true或false

时间:2017-05-18 14:16:23

标签: c# .net

Convert.ChangeType("1", typeof(bool))返回运行时错误

有没有办法覆盖这种行为?

我希望Convert.ChangeType("1", typeof(bool)) return true Convert.ChangeType("0", typeof(bool))返回false

更新
阅读评论和答案也许我还不够清楚

假设有一个<object,Type>字典,其中type是目标类型

foreach (var element in dictionary)
{
   object convVal = Convert.ChangeType(element.Key, element.Value);
}

element.Key"1"elemen.Valuebool时我想true

任何人都可以给我任何实施类似行为的建议

至少比这更好:

 public static class Convert
    {
        public static object ChangeType(object val, Type type)
        {
            if (val is string && type == typeof(bool))
            {

                switch (((string)val).Trim().ToUpper())
                {
                    case "TRUE":
                    case "YES":
                    case "1":
                    case "-1":
                        return true;

                    default:
                        return false;
                }
            }
            return System.Convert.ChangeType(val, type);
        }
    }

TypeConverter可以是正确的方法吗?

请在发布评论或答案之前考虑或将问题标记为重复

5 个答案:

答案 0 :(得分:4)

bool flag = Convert.ToBoolean(Convert.ToInt32("1"));

答案 1 :(得分:2)

我认为这种情况的最佳方法是使用如下方程式;

string myString = "1";
bool myBool = myString == "1";

答案 2 :(得分:1)

主要问题是,类型级别支持stringbool的转换,但大多数字符串值都失败。这意味着,您首先必须检查自定义转换规则,然后再返回默认转换器。一些CanConvert...函数将返回true,导致实际转换时出现运行时异常。

因此,为了接受true的任何非零数字字符串和false的零,首先单独检查数字,然后使用自定义类型转换器,以防它们被提供并回退到默认值如果没有找到其他内容,您可以使用以下内容:

static object CustomConvert(object value, Type targetType)
{
    decimal numericValue;
    if ((targetType == typeof(bool) || targetType == typeof(bool?)) && 
        value is string &&
        decimal.TryParse((string)value, out numericValue))
    {
        return numericValue != 0;
    }
    var valueType = value.GetType();
    var c1 = TypeDescriptor.GetConverter(valueType);
    if (c1.CanConvertTo(targetType)) // this returns false for string->bool
    {
        return c1.ConvertTo(value, targetType);
    }
    var c2 = TypeDescriptor.GetConverter(targetType);
    if (c2.CanConvertFrom(valueType)) // this returns true for string->bool, but will throw for "1"
    {
        return c2.ConvertFrom(value);
    }
    return Convert.ChangeType(value, targetType); // this will throw for "1"
}

注意我没有检查在两个类型转换器(From和To)已经失败之后尝试Convert.ChangeType是否有用...此时只是抛出异常。

答案 3 :(得分:0)

怎么样:

bool x = myString.Equals("1");

答案 4 :(得分:0)

Convert.ToBoolean(Convert.ChangeType("1", typeof(uint)));