c# – 如何构建一个流利的嵌套Guard API

c# – 如何构建一个流利的嵌套Guard API,第1张

概述我正在构建一个简单的Guard API来防止非法参数传递给函数等等. 我有如下代码: public static class Guard{ public static GuardArgument<T> Ensure<T>(T value, string argumentName) { return new GuardArgument<T>(value, argum 我正在构建一个简单的Guard API来防止非法参数传递给函数等等.

我有如下代码:

public static class Guard{    public static GuardArgument<T> Ensure<T>(T value,string argumentname)    {        return new GuardArgument<T>(value,argumentname);    }}public class GuardArgument<T>{    public GuardArgument(T value,string argumentname)    {        Value = value;        name = name;    }    public T Value { get; private set; }    public string name { get; private set; }}// Example extension for valIDity checkspublic static GuardArgument<T> IsNotNull<T>(this GuardArgument<T> guardArgument,string errorMessage){    if (guardArgument.Value == null)    {        throw new ArgumentNullException(guardArgument.name,errorMessage);    }    return guardArgument;}

目前代码可以以类似的方式使用(注意这只是一个愚蠢的例子):

voID DummyMethod(int? someObject) {    Guard.Ensure(someObject,"someObject")       .IsNotNull()       .IsGreaterThan(0)       .IsLessthan(10);}

这一切都很好.现在我想要做的是扩展API,以便以下列方式将子属性包含在检查中:

Guard.Ensure(someObject,"someObject")    .IsNotNull()    .Property(        (x => x.ChildProp1,"childProp1")           .IsNotNull()           .IsGreaterThan(10)     )     .Property(        (x => x.ChildProp2,"childProp2")           .IsNotNull()           .IsLessthan(10)     );

显然,新的.Property方法需要返回父GuardArgument才能链接.此外,子属性需要能够使用现有的检查方法(IsNotNull()等)来避免代码重复.

我无法解释如何构造lambda / property函数参数或者.Property方法应该在哪里找到 – 即应该是GuardArgument或其他地方的属性,或者即使API有更好的结构.

解决方法 以下功能允许与您想要的语法类似.
public static GuardArgument<T> Property<T,TProp>(this GuardArgument<T> guardArgument,Func<T,TProp> getProperty,string propertyname,Action<GuardArgument<TProp>> valIDate){    GuardArgument<TProp> propertyguardArgument = new GuardArgument<TProp>(getProperty(guardArgument.Value),propertyname);    valIDate(propertyguardArgument);    return guardArgument;}

该函数为选定的属性创建一个新的GuardArgument,然后将其传递给Action参数,以允许您根据需要进行验证.

这也允许无限链接的属性,虽然我不确定将是特别可读.

用法:

Guard.Ensure(someObject,"someObject")     .IsNotNull()     .Property(x => x.ChildProp1,"childProp1",childProp1 =>         childProp1.IsNotNull()                   .IsLessthan(10)                   .Property(y => y.InnerChildProperty,"innerChildProperty",innerChildProperty =>                       innerChildProperty.IsNotNull()                    )     )     .Property(x => x.ChildProp2,"childProp2",childProp2 =>         childProp2.IsNotNull()                   .IsGreaterThan(10)     );
总结

以上是内存溢出为你收集整理的c# – 如何构建一个流利的嵌套Guard API全部内容,希望文章能够帮你解决c# – 如何构建一个流利的嵌套Guard API所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存