文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

消灭代码中的 if :请求参数校验的优雅之道

2024-11-29 21:20

关注

那么,如何干掉这些烦人的if语句,让参数校验变得更加优雅呢?下面,我们将通过C#的例子来探讨这个问题。

使用特性(Attributes)进行校验

C# 提供了丰富的特性(Attributes)机制,我们可以利用这一机制来进行参数校验。通过定义自定义的特性,并将这些特性应用于方法的参数上,我们可以在运行时自动进行参数校验,从而避免了大量的if语句。

下面是一个简单的例子,展示如何使用自定义特性进行参数校验:

using System;
using System.Reflection;

// 定义一个自定义的校验特性
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
public class NotNullAttribute : Attribute
{
    // 可以在这里添加一些自定义的逻辑
}

public class Validator
{
    public static void ValidateParameters(MethodInfo method, object[] parameters)
    {
        ParameterInfo[] paramInfos = method.GetParameters();
        for (int i = 0; i < paramInfos.Length; i++)
        {
            object param = parameters[i];
            NotNullAttribute attr = paramInfos[i].GetCustomAttribute();
            if (attr != null && param == null)
            {
                throw new ArgumentNullException(paramInfos[i].Name);
            }
            // 可以根据需要添加更多的校验逻辑
        }
    }
}

public class ExampleService
{
    public void ExampleMethod([NotNull] string param1, int param2)
    {
        // 方法体
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        ExampleService service = new ExampleService();
        MethodInfo method = typeof(ExampleService).GetMethod("ExampleMethod");
        object[] parameters = new object[] { null, 123 }; // 这里故意传入一个null值以触发校验失败
        Validator.ValidateParameters(method, parameters); // 这行会抛出ArgumentNullException异常,因为param1为null且被标记为[NotNull]
        // 如果校验通过,则继续执行方法体
        // method.Invoke(service, parameters); // 实际使用时,在校验通过后再调用方法
    }
}

在这个例子中,我们定义了一个NotNullAttribute特性,并将其应用于ExampleMethod方法的param1参数上。然后,我们创建了一个Validator类,该类具有一个静态方法ValidateParameters,该方法接受一个MethodInfo对象和一个参数数组,并对参数进行校验。如果某个参数被标记为NotNull但值为null,则该方法会抛出一个ArgumentNullException异常。

使用FluentValidation库

除了使用自定义特性外,我们还可以利用现有的校验库来简化参数校验。FluentValidation是一个流行的.NET校验库,它提供了丰富的校验规则和友好的API。

下面是一个使用FluentValidation进行参数校验的例子:

首先,安装FluentValidation NuGet包:

Install-Package FluentValidation

然后,创建一个校验器类:

using FluentValidation;

public class ExampleValidator : AbstractValidator
{
    public ExampleValidator()
    {
        RuleFor(x => x.Param1).NotNull().WithMessage("Param1 cannot be null");
        RuleFor(x => x.Param2).GreaterThan(0).WithMessage("Param2 must be greater than 0");
        // 可以根据需要添加更多的校验规则
    }
}

public class ExampleRequest
{
    public string Param1 { get; set; }
    public int Param2 { get; set; }
}

在业务逻辑中使用校验器:

public class ExampleService
{
    private readonly ExampleValidator _validator;
    
    public ExampleService()
    {
        _validator = new ExampleValidator();
    }
    
    public void ExampleMethod(ExampleRequest request)
    {
        ValidationResult result = _validator.Validate(request);
        if (!result.IsValid)
        {
            throw new ValidationException(result.Errors); // 这里可以自定义异常处理逻辑
        }
        // 如果校验通过,则继续执行方法体
    }
}

在这个例子中,我们创建了一个ExampleValidator类,该类继承了FluentValidation的AbstractValidator类,并定义了校验规则。然后,在ExampleService类的ExampleMethod方法中,我们使用ExampleValidator对请求参数进行校验。如果校验失败,我们抛出一个自定义的异常。这种方法使代码更加清晰和易于维护,同时避免了大量的if语句。

来源:程序员编程日记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯