FluentValidation:默认情况下自动对所有属性应用规则

2024-04-04

我有一个具有某些属性的 Person 类,因此我想默认情况下自动对所有属性应用 FluentValidation 规则

  • Example:
    • string: NotNull(), NotEmpty(), Length()...
    • enum: IsInEnum()
    • List: NotNull() or something else...
    • ...

人与扩展方法

public enum Gender { Male, Female }

public class Person
{
    public Gender Gender { get; set; }
    public string Name { get; set; }
    public List<string> Notes { get; set; }
}

public static class Extension
{
    public static Expression<Func<T, TProperty>> GenerateExpression<T, TProperty>(PropertyInfo propInfo)
    {
        ParameterExpression paramExp = Expression.Parameter(typeof(T));
        MemberExpression memExp = Expression.Property(paramExp, propInfo);
        UnaryExpression unaryExp = Expression.Convert(memExp, propInfo.PropertyType);
        return Expression.Lambda<Func<T, TProperty>>(unaryExp, paramExp);
    }
}

基础验证器

I use Extension.GenerateExpression建造Expression基于列表属性,然后将其传递到RuleFor(),但它仅适用于字符串类型。 我不知道如何处理其他数据类型。

public class BaseValidator<T> : AbstractValidator<T>
{
    public BaseValidator()
    {
        ParameterExpression paramExp = Expression.Parameter(typeof(T));

        foreach (PropertyInfo propInfo in typeof(T).GetProperties())
        {
            // String [WORKED]
            if (propInfo.PropertyType == typeof(string))
            {
                Expression<Func<T, string>> expression = Extension.GenerateExpression<T, string>(propInfo);
                RuleFor(expression).Length(1, 10); //.Matches("pattern");
            }

            // List [NOT WORK]
            else if (propInfo.PropertyType.IsGenericType)
            {
                Expression<Func<T, object>> expression = Extension.GenerateExpression<T, object>(propInfo);
                RuleFor(expression).NotNull(); //ItemsInRange(1, 2);
            }

            // Enum [EXCEPTION]
            else if (propInfo.PropertyType.IsEnum)
            {
                Expression<Func<T, Enum>> expression = Extension.GenerateExpression<T, Enum>(propInfo);
                // Expression of type 'Gender' cannot be used for return type 'System.Enum''
                RuleFor(expression).IsInEnum();
            }

            // Other type [How to handle?]
            else
            {
                //Expression<Func<T, ???>> expression = GenerateExpression<T, ???>(propInfo);
            }
        }
    }
}

人员验证器

public class PersonValidator : BaseValidator<Person> { }

Program

public class Program
{
    public static void Main(string[] args)
    {
        Person person = new Person
        {
            Name = "Name",
            Gender = Gender.Male,
            Notes = new List<string> { "Note 1", "Note 2" }
        };

        PersonValidator validation = new PersonValidator();
        ValidationResult result = validation.Validate(person);

        foreach (var error in result.Errors)
        {
            Console.WriteLine(error);
        }

        Console.ReadKey();
    }
}

你可以尝试使用这个:

UnaryExpression unaryExp = Expression.Convert(memExp, typeof(TProperty));

代替:

UnaryExpression unaryExp = Expression.Convert(memExp, propInfo.PropertyType);

它应该有助于通用属性,但恐怕它对枚举没有帮助。IsInEnum方法必须知道枚举属性的真实类型,而不仅仅是Enum.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FluentValidation:默认情况下自动对所有属性应用规则 的相关文章

  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • 如何在线程创建和退出时调用函数?

    include
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • 有没有办法将 boost::json::serializer 切换为美化输出?

    Using boost json serializer如中的示例所示文档 快速查看 http vinniefalco github io doc json json usage quick look html以紧凑格式保存 json tre
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 从 exit() 和 fork() 返回的结果奇怪地发生了位移

    我有一个 C 代码 有时会自行分叉 每个分叉都会执行一些操作 然后返回一个错误代码 目前 每个子进程返回其 ID 0 n void other int numero exit numero int main for int i 0 i lt
  • 如何使用 xamarin 表单提示用户进行地理定位

    我正在 Xamarin Forms 应用程序中开发一个应用程序 需要请求地理位置权限 如果获得许可 它需要从设备获取地理位置数据 然后将地理位置坐标放入 Forecast io URL 我正在使用 James 的 Geolocator 插件
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix

随机推荐

  • 如何延长 CloudBuild 超时

    我尝试了许多不同的选项来延长 CloudBuild 持续时间 但我的 gcloud 应用程序部署步骤总是在 10 分钟后超时 根据其他线程的提示 我在本地终端上尝试了此设置 gcloud config set app cloud build
  • 我应该使用 Selenium 还是 Jasmine 来使用 RSpec 测试视图文件?

    我使用 Ruby on Rails 3 2 2 cucumber rails 1 3 0 rspec rails 2 8 1 和 capybara 1 1 2 以及 Selenium 驱动程序 收到我的答复后上一个问题 https stac
  • 更改 SF 对象的 CRS

    我有一些 道路 作为 sp 对象 class SpatialLinesDataFrame features 17360 extent 490176 4 567680 9 148639 1 212821 xmin xmax ymin ymax
  • 在开始日期和结束日期之间 Firestore

    我的文件带有startDate and endDate 我想查询的范围之间startDate and endDate 我可以在一个日期的范围之间查询 如下所示 whereField startDate isGreaterThan start
  • 在 Android 编辑文本的提示上显示错误

    如果用户在编辑文本中输入空白值 我想显示错误 但是我不知道如何执行此操作 这就是我想要的方式 这是我创建的 xml
  • 使用滑动手势关闭键盘(如在消息应用程序中)

    当键盘显示在 iPhone 的消息应用程序上时 如果用户开始从消息表视图向下滑动并继续进入键盘区域 键盘将开始消失 如果他们在此过程中上下移动手指 键盘也会随之移动 Apple 是否使用私有 API 来做到这一点 或者有没有办法通过 我推测
  • 通过 Ctypes 将 std:vector 从 C++ 传递到 Python:获取无意义的值

    我试图遵循程序 https stackoverflow com a 14887649 8408902但我被困住了 我正在尝试通过std vector来自我的 C 代码 包含在extern C 到Python 这就是我所拥有的 extern
  • 如何同时加入 multiprocessing.Process() 列表?

    Given a list 跑步的multiprocessing Process 实例 我怎样才能加入所有实例并在其中一个实例退出时立即返回而没有Process join 超时和循环 Example from multiprocessing
  • IPv4 允许的最大 TCP/IP 网络端口号是多少?

    可以使用的最大端口号是多少 端口号是一个无符号 16 位整数 即 65535
  • 使用js删除html按钮

    我下面有一些代码 用于在 html 表单上创建一个按钮 当用户使用按钮输入一些信息时 我希望表单通过删除按钮并将其替换为纯文本来反映这一点 我尝试获取内部 html 并使用 div 但没有任何效果 有人可以帮忙吗 我并不是在寻找任何人为我编
  • 在 Python 中比较两个列表中的值

    在 Python 2 7 中 我有两个整数列表 x 1 3 2 0 2 y 1 2 2 3 1 我想创建第三个列表 指示每个元素是否x and y是相同的 产生 z 1 0 1 0 0 如何使用列表理解来做到这一点 我的尝试是 z i j
  • Scala 更新数组元素

    我从没想过我会问这么简单的问题 但是如何更新 scala 中的数组元素 我已经在我的 Main 对象中声明了内部函数 我有这样的东西 object Main def main args Array String def miniFunc n
  • Android FragmentStatePagerAdapter

    我正在使用 FragmentStatePagerAdapter这个例子 http developer android com reference android support v4 app FragmentStatePagerAdapte
  • Javascript 和 C# 舍入地狱

    如您所知 由于天才舍入规则C 我们得到以下值 decimal d 2 155M var r Math Round d 2 2 16 decimal d 2 145M var r Math Round d 2 2 14 现在在客户端Javas
  • 从另一个桌面捕获屏幕截图

    我使用创建了第二个桌面CreateDesktop我不会切换到它 我还在其中创建了一些进程 例如 Explorer exe 和 Winrar exe 接下来我有一个代码 它将当前桌面的屏幕截图保存到剪贴板 CreateDesktop 和 Sc
  • Javascript AJAX 功能在 IE 中不起作用?

    我有这个代码 function render message id var xmlHttp xmlHttp new XMLHttpRequest xmlHttp onreadystatechange function if xmlHttp
  • 将二维列表写入JSON文件

    我有一个二维列表 例如 data 1 2 3 2 3 4 4 5 6 我想将其写入 JSON 文件 如下所示 data 1 2 3 2 3 4 4 5 6 我得到这个 json dumps data indent 4 sort keys T
  • ld:架构 x86_64 构建失败的 1 个重复符号

    我构建失败 我尝试了很多方法 但我不知道如何解决它 duplicate symbol GSDK GTMNSDataZLibExportToSuppressLibToolWarning in Users Macpro Documents ev
  • css @font-face 不适用于 Firefox

    以下代码适用于 Google Chrome beta 和 IE 7 但不适用于 Firefox font face font family open sans semiboldregular src url fonts opensans s
  • FluentValidation:默认情况下自动对所有属性应用规则

    我有一个具有某些属性的 Person 类 因此我想默认情况下自动对所有属性应用 FluentValidation 规则 Example string NotNull NotEmpty Length enum IsInEnum List No