Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将对象作为指定类型读取的C#扩展方法_C# - Fatal编程技术网

将对象作为指定类型读取的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,然后尝试转换)。这主要用于简单类型。