Sec*_*ret 22 c# types reference type-conversion value-type
我正在尝试将value "0"(System.String)转换为其Boolean表示形式,如:
var myValue = Convert.ToBoolean("0"); // throwing an exception here
Run Code Online (Sandbox Code Playgroud)
我查看了MSDN页面,在代码示例块中,我找到了这些行:
ConvertToBoolean("0");
// ...
Unable to convert '0' to a Boolean.
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我正在转换System.String为Boolean这样:
// will be OK, but ugly code
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
Run Code Online (Sandbox Code Playgroud)
Boolean没有这样丑陋代码的类型?System.String转换为值类型System.Boolean,但System.Int32也是值类型,不是吗?Jes*_*sse 59
发生这种情况是因为Convert.ToBoolean期待以下之一:
"True"(String) =true"False"(String) =false0 (数字类型; int,double,float等)= false0(数字类型; ...)=truenull = false任何其他值都无效Boolean.
你已经有了一个干净的方法:
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
Run Code Online (Sandbox Code Playgroud)
编辑:您可以创建一个扩展方法,为您处理其中的一些案例,同时隐藏处理转换的丑陋.
此扩展提供了非常宽松的解释Boolean:
"True" (String)= true"False" (String)= false"0" (String)= falsetrue码:
public static class Extensions
{
public static Boolean ToBoolean(this string str)
{
String cleanValue = (str ?? "").Trim();
if (String.Equals(cleanValue, "False", StringComparison.OrdinalIgnoreCase))
return false;
return
(String.Equals(cleanValue, "True", StringComparison.OrdinalIgnoreCase)) ||
(cleanValue != "0");
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要更严格的方法,那么遵循.NET Framework期望的方法; 然后只需使用try/catch语句:
public static class Extensions
{
public static Boolean ToBoolean(this string str)
{
try
{
return Convert.ToBoolean(str);
}
catch { }
try
{
return Convert.ToBoolean(Convert.ToInt32(str));
}
catch { }
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然不是一个干净或漂亮的方法,但它保证了获得正确价值的更多可能性.并且,该Extensions课程远离您的数据/业务代码.
最后,您的转换代码使用起来相对简单:
String myString = "1";
Boolean myBoolean = myString.ToBoolean();
Run Code Online (Sandbox Code Playgroud)
public static class BooleanParser
{
public static bool SafeParse(string value)
{
var s = (value ?? "").Trim().ToLower();
return s == "true" || s == "1";
}
}
Run Code Online (Sandbox Code Playgroud)
static readonly HashSet<string> _booleanTrueStrings = new HashSet<string> { "true", "yes", "1" };
static readonly HashSet<string> _booleanFalseStrings = new HashSet<string> { "false", "no", "0" };
public static bool ToBoolean(string value)
{
var v = value?.ToLower()?.Trim() ?? "";
if (_booleanTrueStrings.Contains(v)) return true;
if (_booleanFalseStrings.Contains(v)) return false;
throw new ArgumentException("Unexpected Boolean Format");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49620 次 |
| 最近记录: |