我正在尝试进行一些数据转换 . 不幸的是,大部分数据都是字符串,它应该是int或double等等......
所以我得到的是:
double? amount = Convert.ToDouble(strAmount);
这种方法的问题是如果strAmount是空的,如果它是空的我希望它等于null,所以当我将它添加到数据库时,该列将为null . 所以我最后写了这个:
double? amount = null;
if(strAmount.Trim().Length>0)
{
amount = Convert.ToDouble(strAmount);
}
现在这个工作正常,但我现在有五行代码而不是一行代码 . 这使得事情变得更难以阅读,特别是当我有大量的列要转换时 .
我以为我会使用字符串类和泛型的扩展来传入类型,这是因为它可能是double,或int或long . 所以我尝试了这个:
public static class GenericExtension
{
public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct
{
if (s.Trim().Length > 0)
{
return (Nullable<T>)s;
}
return null;
}
}
但我收到错误:无法将类型'string'转换为'T?'
有没有解决的办法?我不太熟悉使用泛型创建方法 .
16 回答
要记住的另一件事是字符串本身可能为null .
您可以尝试使用以下扩展方法:
这样你可以这样做:
那这个呢:
当然,这并没有考虑转换失败 .
我写了这个泛型转换器 . 它适用于Nullable和标准值,在所有可转换类型之间进行转换 - 而不仅仅是字符串 . 它处理您期望的各种场景(默认值,空值,其他值等...)
我已经在几十个 生产环境 程序中使用了大约一年,所以它应该非常可靠 .
您可能想尝试:
做你自己的空检查并在必要时返回
int?
. 你还想把它包装在try {}
中试一试......
然后像这样称呼它......
我喜欢Joel的回答,但我对它进行了一些修改,因为我不喜欢吃异常 .
您可以将以下内容与对象一起使用,但不幸的是,这不适用于字符串 .
我用它来包装属性中的会话变量(在基页上)..所以我的实际用法是(在我的基页中):
我能够在页面逻辑中检查null:
没有办法解决这个问题 . Nullable以及您的方法仅限于使用值类型作为其参数 . String是引用类型,因此与此声明不兼容 .
有一个通用的解决方案(适用于任何类型) . 可用性很好,但应该改进实施:http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
这允许你编写非常干净的代码,如下所示:
并且:
这是基于公认答案的东西 . 我删除了try / catch以确保不会吞下所有异常并且不处理 . 还要确保返回变量(在接受的答案中)永远不会被初始化两次 .
我的anonimous类型的例子:
另一种变化 . 这个
不吞下异常
如果无法从
string
转换类型,则抛出NotSupportedException
. 例如,没有类型转换器的自定义结构 .如果字符串无法解析,则返回
(T?)null
. 无需检查null或空格 .让我们在堆栈中添加一个类似的解决方案 . 这个也解析枚举,看起来不错 . 非常安全 .
https://github.com/Pangamma/PangammaUtilities-CSharp/blob/master/PangammaUtilities/Extensions/ToNullableStringExtension.cs
“Joel Coehoorn”提供的通用答案很好 .
但是,这是另一种不使用
GetConverter...
或try/catch
块的方式...(我不确定但在某些情况下这可能有更好的性能):用法如下: