Есть ли.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-приложении.