C#,Lokad.Shared:如何编写与Enforce一起使用的自定义规则

时间:2009-03-20 14:02:23

标签: c#

我正在尝试Lokad Shared Libraries,它看起来非常有趣和有用。我可以使用例如:

Enforce.Arguments(() => arg1, () => arg2);

如果arg1或arg2为null则抛出异常。但我想检查IEnumerable是否至少有一个项目。我可以用:

Enforce.That(someSequence.Count() > 0);

但这不会产生非常有用的错误消息。我试图查看示例代码等,以了解如何编写和使用自定义规则。但我似乎无法弄明白!

我到目前为止(或者更短......更确切地说......):

  • 我应该创建一个类来收集我的规则。
  • 我想我需要以某种方式创建一个Lokad.Rules.Rule<T>代表?
  • 可能需要用IScope做些什么,无论是什么......
  • 然后以某种方式将该规则与其中一种Enforce方法一起使用,虽然我不太确定如何......

总而言之,这就是我想要的结果:

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
}

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

a blog postRinat 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>方法中检查了...所以我问过这个...