我正在尝试Lokad Shared Libraries,它看起来非常有趣和有用。我可以使用例如:
Enforce.Arguments(() => arg1, () => arg2);
如果arg1或arg2为null则抛出异常。但我想检查IEnumerable是否至少有一个项目。我可以用:
Enforce.That(someSequence.Count() > 0);
但这不会产生非常有用的错误消息。我试图查看示例代码等,以了解如何编写和使用自定义规则。但我似乎无法弄明白!
我到目前为止(或者更短......更确切地说......):
Lokad.Rules.Rule<T>
代表?总而言之,这就是我想要的结果:
public static void DoStuff<T>(this IEnumerable<T> subjects)
{
Enforce.Argument(() => subjects);
// Somehow in an equally smooth way check that
// subjects contains at least one element
// Do stuff
}
任何人都可以提供帮助吗?
答案 0 :(得分:1)
在a blog post的Rinat Abdullin中询问了同样的问题。得到了这个答案:
以下是使用最简单的实现:
public static class EnumerableIs { public static void NotEmpty<T>(IEnumerable<T> collection, IScope scope) { if (!collection.Any()) { scope.Error("Enumerable can't be empty."); } scope.ValidateInScope(collection); } } [Test, ExpectedException(typeof(ArgumentException))] public void Test() { IEnumerable<object> t = null; Enforce.Argument(() => t, EnumerableIs.NotEmpty); } [Test, ExpectedException(typeof(ArgumentException))] public void Test2() { var t = new int[0]; Enforce.Argument(() => t, EnumerableIs.NotEmpty); } [Test, ExpectedException(typeof(ArgumentException))] public void Test3() { var t = new[] { new object(), null }; Enforce.Argument(() => t, EnumerableIs.NotEmpty); }
这实际上是有效的。测试方法会抛出这些消息的异常:
测试1: “IEnumerable`1”类型的对象不应为null。 参数名称:t
的Test2: 可枚举不能为空。 参数名称:t
Test3的: “对象”类型的对象不应为null。 参数名称:t。1
不太确定Test1和Test3从哪里得到了他们的消息......比如,它在NotEmpty<T>
方法中检查了...所以我问过这个...