将对象作为指定类型读取的C#扩展方法
我经常发现以下情况: 您有一个要转换为整数的字符串 但首先您必须检查:将对象作为指定类型读取的C#扩展方法,c#,C#,我经常发现以下情况: 您有一个要转换为整数的字符串 但首先您必须检查: string sId = null; if (!string.IsNullOrEmpty(sId)) { return int.Parse(sId); } else { return -1; } 但我想要的是能够做到这一点: sId.As<int>(-
string sId = null;
if (!string.IsNullOrEmpty(sId))
{
return int.Parse(sId);
}
else
{
return -1;
}
但我想要的是能够做到这一点:
sId.As<int>(-1)
sId.As(-1)
所以我能做的就是写一个exension方法,如下所示:
public static class ObjectExtensions
{
public static T As<T>(this object instance, T defaultValue)
{
try
{
if (instance != null)
{
return (T)Convert.ChangeType(instance, typeof(T));
}
}
catch
{
}
return defaultValue;
}
}
公共静态类ObjectExtensions
{
公共静态T As(此对象实例,T defaultValue)
{
尝试
{
if(实例!=null)
{
return(T)Convert.ChangeType(实例,typeof(T));
}
}
抓住
{
}
返回默认值;
}
}
我的问题是,是否有人认为这是一个好方法
是否有任何内置于.NET 3.5或更高版本中的东西可以做到这一点?我将检查类型是否可以更改,而不是捕获抛出的异常。在
CanChangeType
中描述了一种方法。您不能改用Int.TryParse
吗
string str = null;
int i;
bool result = Int32.TryParse(str, out i);
我认为如果您的程序需要它,这是可以的,但我想提出一些风格建议:
- 称它为Convert而不是As
- 让defaultValue采用默认值
- 考虑不要将其作为扩展方法。我知道扩展方法很棒,但我认为扩展方法的第一个参数是System.Object,这有点过于混乱。问题是你在IDE中点击了自动完成键,你开始在你的程序中使用的每一个对象上发现一堆奇怪的扩展方法。转换不是一种常见的操作,所以我想我更喜欢MyUtil.Convert
public static class MyUtil {
public static T Convert<T>(object instance, T defaultValue=default(T))
公共静态类MyUtil{
公共静态T转换(对象实例,T defaultValue=default(T))
*编辑*
我还可以提出另一种语法
public static bool TryConvert<T>(object instance, out T result) {
publicstaticbooltryconvert(对象实例,out T结果){
*编辑2*
我可能会建议使用IConvertible而不是object,只是将接口缩小一点:
public static T Convert<T>(IConvertible instance, T defaultValue=default(T)) {
...
}
public static bool TryConvert<T,U>(T instance, out U result) where T : IConvertible {
...
}
公共静态T转换(IConvertible实例,T defaultValue=default(T)){
...
}
公共静态bool TryConvert(T实例,out U结果),其中T:IConvertible{
...
}
可能重复的您最好使用int.TryParse.,可能对您有帮助。FWIW我会避免向
对象添加扩展方法,因为它会在任何地方污染您的intellisense…关键是他希望库的用户指定目标类型;“int”是的,我可以,但有两个问题。首先,如果我将整数初始化为-1,它似乎不会保留默认值,而且还有额外的代码来声明一个int变量,然后检查布尔值。我想要一种优雅的方法来转换存储在例如哈希表(首先检查是否为null,然后尝试转换)。这主要用于简单类型。