Есть ли.NET Fluent Argument для проверки библиотек?

Глядя на исходный код Shrinkr(мы все просматриваем исходный код другого проекта, верно???:)) я заметил следующий код kewl.. (сокращенно мной ниже)

public virtual Foo Foo
{
    get;
    set 
    {
        Check.Argument.IsNotNull(value, "value"); 
        // then do something.
    }
}

Заметили беглый способ проверки аргументов? Ницца:)

http://cherrythian.com/images/borat.jpg

Итак... проверяя код, у них есть некоторый пользовательский класс, который делает это...

public static class Check
{
    public static class Argument
    {
        public static void IsNotNull(object parameter, 
                                     string parameterName)
        { ... }

        public static void IsNotNullOrEmpty(string parameter, 
                                            string parameterName)
        { ... }

 .... etc ....
}

Есть ли какие-то общие рамки там?

гем установить netFluentCheck?

:)

5 ответов

Решение

В итоге я использовал условия CuttingEdge, найденные в Codeplex.

например.

// Check all preconditions:
Condition.Requires(id, "id")
    .IsNotNull()          // throws ArgumentNullException on failure
    .IsInRange(1, 999)    // ArgumentOutOfRangeException on failure
    .IsNotEqualTo(128);   // throws ArgumentException on failure

отлично:)

Вот простой класс длиной всего несколько строк, который я написал некоторое время назад (отсюда: http://code.google.com/p/hotwire-queue/wiki/QuickAssert), который делает что-то похожее на свободную проверку, использует немного другой стиль, который я нахожу немного легче читать (ymmv). Не требует никаких сторонних библиотек, и если проверка не удалась, вы получите простое сообщение об ошибке с точным кодом, который не удалось.

config.Active.Should().BeTrue();
config.RootServiceName.Should().Be("test-animals");
config.MethodValidation.Should().Be(MethodValidation.afterUriValidation);
var endpoints = config.Endpoints;
endpoints.Should().NotBeNull().And.HaveCount(2);

к этому:

config.Ensure(c => c.Active,
              c => c.RootServiceName == "test-animals",
              c => c.MethodValidation == MethodValidation.afterUriValidation,
              c => c.Endpoints != null && c.Endpoints.Count() == 2);

Вот класс, надеюсь, что это полезно как отправная точка для кого-то;-D

using System;
using System.Linq.Expressions;
using NUnit.Framework;

namespace Icodeon.Hotwire.Tests.Framework
{
    public static class QuickAssert
    {
        public static void Ensure<TSource>(this TSource source, params Expression<Func<TSource, bool>>[] actions)
        {
            foreach (var expression in actions)
            {
                Ensure(source,expression);
            }
        }

        public static void Ensure<TSource>(this TSource source, Expression<Func<TSource, bool>> action)
        {
            var propertyCaller = action.Compile();
            bool result = propertyCaller(source);
            if (result) return;
            Assert.Fail("Property check failed -> " + action.ToString());
        }
    }
}

В то время, когда я писал Ensure, контракты на код не поддерживались в Visual Studio 2010, но теперь см. http://msdn.microsoft.com/en-us/magazine/hh148151.aspx

Вот тот, который использует выражения. Поскольку это довольно тривиально, у каждого, кажется, есть своя реализация этого...

Вы можете попробовать Bytes2you.Validation ( Project). Это быстрая, расширяемая, интуитивно понятная и простая в использовании библиотека C#, предоставляющая свободные API для проверки аргументов. Предоставляет все необходимое для реализации защитного программирования в вашем.NET-приложении.

Другие вопросы по тегам