扩展方法中的错误处理

时间:2013-12-06 16:38:11

标签: c# exception-handling extension-methods

所以我的情况稍微复杂一点,但这样可以解决问题。我们将使用典型的人物对象。

public class Person()
{
    public string FirstName {get; set; }
    public string LastName {get; set; }
}

现在我有一个person对象列表但是典型的扩展方法还不够。我想添加自己的,所以我创建了一个扩展类,编译器就是它的神奇之处。

public static class ListExtension()
{
    public static string FullName(this Person source)
    {
         return source.FirstName + " " + source.LastName;
    }
}

一切都很好。现在我关心错误处理。我是在扩展中实现错误处理还是添加另一种扩展方法(我想的是TryParse())。例如:

    public static string FullName(this Person source)
    {
         if(source.FirstName == null || source.FirstName == "")
         { throw new ArgumentException("The first name is null or empty!"); }

         return source.FirstName + " " + source.LastName;
    }

OR

public static bool TryNameConcat(this Person source)
{
    bool _isSafe = false;

    if(source.FirstName != null && source.LastName != null)
    { _isSafe = true; }

    return _isSafe;
}

在我看来,两者之间的实施是非常不同的。它可能对电子/周期数等没有影响,但是一种方法似乎是主动的而另一种是反应性的?

  

编辑:

感谢您的指示和评论。正如我在开始时所说,我的情况更复杂。我只是简单地编写了这个简单的方法。我是否在扩展方法中抛出异常,或者在继续执行可能出错的操作之前主动进行健全性检查。

2 个答案:

答案 0 :(得分:1)

首先你应该质疑扩展方法的必要性,为什么不把它作为一个实例方法开始。

对于扩展方法中的错误检查,对于您的特定示例,您不必检查null,因为string.Concat将用空字符串替换null。但是对于First和Last名称之间的分隔符放置,您需要进行检查。

我猜你正在处理与简单字符串连接不同的情况,如果你真的必须编写扩展方法(而不是实例方法)那么在扩展方法中提取功能只有你才有意义将独立使用它。在您的情况下,如果您的方法TryNameConcat可以在没有方法FullName的情况下独立使用,那么在扩展方法中使用逻辑,否则不要。

答案 1 :(得分:1)

扩展方法与任何其他(静态)方法没有区别。它只是'语法糖'使它看起来不同,但编译器将其解析为常规方法。 因此,您可以像对待任何其他方法一样对待它。换句话说:从扩展方法中抛出异常(即使用第一个解决方案),并将方法调用包装在try/catch - 块中。

HTH Thomas