所以我的情况稍微复杂一点,但这样可以解决问题。我们将使用典型的人物对象。
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;
}
在我看来,两者之间的实施是非常不同的。它可能对电子/周期数等没有影响,但是一种方法似乎是主动的而另一种是反应性的?
编辑:
感谢您的指示和评论。正如我在开始时所说,我的情况更复杂。我只是简单地编写了这个简单的方法。我是否在扩展方法中抛出异常,或者在继续执行可能出错的操作之前主动进行健全性检查。
答案 0 :(得分:1)
首先你应该质疑扩展方法的必要性,为什么不把它作为一个实例方法开始。
对于扩展方法中的错误检查,对于您的特定示例,您不必检查null,因为string.Concat
将用空字符串替换null
。但是对于First和Last名称之间的分隔符放置,您需要进行检查。
我猜你正在处理与简单字符串连接不同的情况,如果你真的必须编写扩展方法(而不是实例方法)那么在扩展方法中提取功能只有你才有意义将独立使用它。在您的情况下,如果您的方法TryNameConcat
可以在没有方法FullName
的情况下独立使用,那么在扩展方法中使用逻辑,否则不要。
答案 1 :(得分:1)
扩展方法与任何其他(静态)方法没有区别。它只是'语法糖'使它看起来不同,但编译器将其解析为常规方法。
因此,您可以像对待任何其他方法一样对待它。换句话说:从扩展方法中抛出异常(即使用第一个解决方案),并将方法调用包装在try/catch
- 块中。
HTH Thomas