首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何通过在父类上实现IDataErrorInfo来验证子对象

在C#中,通过在父类上实现IDataErrorInfo来验证子对象,可以通过以下步骤实现:

  1. 首先,需要在父类中实现IDataErrorInfo接口。这个接口包含两个属性:Error和thisstring columnName。Error属性返回一个字符串,表示对象的总体错误信息。thisstring columnName属性返回一个字符串,表示特定属性的错误信息。
代码语言:csharp
复制
public class Parent : IDataErrorInfo
{
    public string Error
    {
        get
        {
            // 返回总体错误信息
        }
    }

    public string this[string columnName]
    {
        get
        {
            // 返回特定属性的错误信息
        }
    }
}
  1. 在父类中实现Error属性和thisstring columnName属性。在这些方法中,可以使用反射来遍历子类的所有属性,并对每个属性进行验证。如果属性值无效,则返回相应的错误信息。
代码语言:csharp
复制
public class Parent : IDataErrorInfo
{
    public string Error
    {
        get
        {
            // 返回总体错误信息
            var errors = new List<string>();
            foreach (var property in GetType().GetProperties())
            {
                var error = this[property.Name];
                if (!string.IsNullOrEmpty(error))
                {
                    errors.Add(error);
                }
            }
            return string.Join("; ", errors);
        }
    }

    public string this[string columnName]
    {
        get
        {
            // 返回特定属性的错误信息
            var property = GetType().GetProperty(columnName);
            if (property == null)
            {
                return null;
            }
            var value = property.GetValue(this);
            if (value == null)
            {
                return "Value cannot be null";
            }
            // 对属性进行验证,并返回相应的错误信息
            return null;
        }
    }
}
  1. 在子类中,可以通过继承父类来继承验证功能。子类可以添加自己的属性和验证逻辑。
代码语言:csharp
复制
public class Child : Parent
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override string this[string columnName]
    {
        get
        {
            // 添加自己的属性验证逻辑
            switch (columnName)
            {
                case "Name":
                    if (string.IsNullOrEmpty(Name))
                    {
                        return "Name cannot be empty";
                    }
                    break;
                case "Age":
                    if (Age < 0 || Age > 150)
                    {
                        return "Age must be between 0 and 150";
                    }
                    break;
            }
            return base[columnName];
        }
    }
}

通过以上步骤,可以在父类上实现IDataErrorInfo接口来验证子对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# API中的模型和它们的接口设计

对象对象之间传递消息 对象对象通常需要交互。如果做得不好,可能会导致难以理解的紧密交叉耦合。为了简化问题,请遵循以下三条规则: 对象可以直接与对象的属性和方法交互。...对象只能通过触发事件与对象进行交互。 对象不能直接与兄弟对象交互,兄弟对象之间的消息必须通过共同的对象传递。 基于这样的设计,可以将对象分解出来,并在没有对象的情况下对其进行测试。...测试本身可以监控只有对象能够处理的事件。 验证——数据模型唯一必须具备的功能 接下来我想谈谈数据模型可能会实现的可选特性。但在开始之前,我想先讨论每个数据模型必须具备的一个特性:验证。...因为它是声明式的,所以可以与UI共享验证逻辑。 混合命令式和基于属性的验证 虽然理论可以使用验证属性完成所有工作,但有时候使用普通代码可以更容易地实现严格的验证。...从理论讲,CollectionChanged相关事件可以使用单个事件告诉我们何时已将整组对象添加到集合中或从集合中删除。但实际,因为WPF中存在的设计缺陷导致无法实现这样的功能。

1.6K20

FluentValidationC# WPF中的应用

,比如1)对象属性的属性,如VM有个学生属性Student,需要验证他的姓名、年龄等,2)集合属性,动态生成表单验证; 能简单提供两种验证样式; 先看实现效果图: unsetunset3....复杂属性:我遇到的问题是,怎么验证ViewModel中对象属性的属性?...IDataErrorInfo接口,即可实现复杂属性验证,文章中没有具体实现,但灵感是从这的,就不具体说该链接代码了,有兴趣可以点击链接阅读,下面贴上代码。...创建验证验证属性的写法有两种: 可以实体属性上方添加特性(本文不作特别说明,百度文章介绍很多); 通过代码的形式添加,如下方,创建一个验证,继承自AbstractValidator,在此验证器构造函数中写规则验证属性...本文使用第二种,通过创建StudentValidator和FieldValidator两个验证介绍。 4.3.1.

17210
  • ASP.NET MVC下的四种验证编程方式

    让数据类型实现IDataErrorInfo接口 一、手工验证绑定的参数 定义具体Action方法的时候,对已经成功绑定的参数实施手工验证无疑是一种最为直接的编程方式,接下来我们通过一个简单的实例演示如何将参数验证逻辑实现在对应的...常规验证可以通过上面列出的这些预定义ValidationAttribute特性完成,但是很多情况下我们需要通过创建自定义的ValidationAttribute特性解决一些特殊的验证。...比如上面演示实例中针对Person对象验证中,我们要求Gender属性指定的表示性别的值必须是“M/m”和“F/f”两者之一,这样的验证就不得不通过自定义的ValidationAttribute特性实现...既然我们将验证操作直接实现在了数据类型,意味着对应的数据对象具有“自我验证”的能力,我们姑且将这些数据类型称为“自我验证类型”。...实现的Validate方法中,我们从验证上下文中获取被验证的Person对象,并对其属性成员进行逐个验证

    1.4K80

    【愚公系列】2023年11月 WPF控件专题 Validation控件详解

    一、Validation控件详解WPF中,可以使用Validation控件实现输入验证。Validation控件可以帮助我们在用户输入数据时进行验证,确保数据的有效性。...常用的Validation控件有:ValidationRule:可以用来验证单个属性或整个对象。可以自定义ValidationRule并将其应用到绑定属性。...IDataErrorInfo:这是一个接口,通过实现它,可以使绑定的元素支持数据验证。...ValidatesOnDataErrors:指示在数据对象实现IDataErrorInfo接口时是否要进行验证。如果设置为true,则在数据对象中的实现中指定的验证逻辑将自动应用。...如果设置为true,则在数据对象中的实现中指定的验证逻辑将自动应用。ValidationStep:指定验证发生的时间。

    41312

    ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProvider

    ,那么这些ModelValidator是如何被创建的呢?...GetTypeDescriptor方法获取容器类型描述对象,进而根据属性类型得到用于描述属性的PropertyDescriptor对象,最终通过该描述对象得到应用在对应属性的所有特性并调用抽象方法GetValidators...对于非属性Model元数据,直接调用GetTypeDescriptor方法得到Model类型描述对象,进而获取应用在Model类型的所有特性并传入抽象方法GetValidators实现对针对Model...,以及定义DataErrorInfoPropertyModelValidator中针对它的提供机制,我们演示一个简单的实例。...通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中我们定义了如下一个实现IDataErrorInfo接口的Contact类型。

    1.4K10

    WPF 表单验证之 INotifyDataErrorlnfo 接口的使用示例

    (《WPF 编程宝典》19.4.1 在数据对象中进行验证) 至于 ExceptionValidationRule,有个缺点就是开发调试时,遇到抛出的异常,会进入中断状态。...后续可能还会研究其它不是针对数据对象验证方式,这是后话了,暂且不表。...,方便之后添加验证代码;结果为自动属性形式,使用了 Fody 实现变动通知;目前三个数都为 int 类型,如下: 加法命令就是简单的计算两个数相加,为了便于演示问题,先将结果置为 0,然后再延迟 200...四、实现验证接口 首先我们让绑定基实现 INotifyDataErrorInfo 接口,实现该接口要实现三个成员: 具体为,一个获取错误列表的方法 GetErrors,一个指示是否存在错误的属性 HasErrors...ValidatesOnNotifyDataErrors=True : 实际,按照《宝典》的说法,这也可以不加,因为默认就是 true,不过为了明确起见还是加上比较好: 然后是需要验证的属性的

    91910

    ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator

    具体Model绑定过程中,ModelBinder通过ValueProvider为Model对象的某个属性提供相应属性值之后,会根据定义基于该属性的Model元数据的验证规则实施验证。...ASP.NET MVC的整个Model验证系统以组件ModelValidator为核心,或者说Model对象验证最终通过某个ModelValidator对象完成,所以我们有必要先来认识一下ModelValidator...this[string columnName] { get; } 5: } ASP.NET MVC的Model验证系统为实现IDataErrorInfo接口的数据对象验证定义专门的...具体来说,对于一个类型实现IDataErrorInfo接口的数据对象,我们可以通过DataErrorInfoClassModelValidator对该对象本身实施验证,DataErrorInfoClassModelValidator...ModelValidator验证实现了IValidatableObject接口的数据对象,其类型为ValidatableObjectAdapter。

    1.5K10

    postMessage 还能这样玩

    其实是因为近期项目中,阿宝哥需要实现页面与 iframe 加载的页面之间的消息通信。另外,刚好近期阿宝哥写 源码分析 专题,所以就到 Github 搜索 ?...阅读完本文之后,你将学到以下知识: 消息系统中握手的作用及如何实现握手; 消息模型的设计及如何实现消息验证保证通信安全; postMessage 的使用及如何利用它实现父子页面的消息通信; 消息通信...该库拥有以下特性: 基于 Promise 的 API,可实现优雅而简单的通信; 使用 消息验证 保护双向 消息通信的安全; 对象公开对象可以访问的可检索的模型对象对象可派发对象已监听的事件...二、如何进行握手 TCP 建立连接的时候,需要进行三次握手。同样,当页面与页面通信的时候,Postmate 也是通过 “握手” 确保双方能正常通信。...四、如何断开连接 当页面与页面完成消息通信之后,我们需要断开连接。这时我们可以调用 ParentAPI 对象的 destroy 方法断开连接。

    2K31

    C# 特性 System.ComponentModel 命名空间属性方法大全,System.ComponentModel 命名空间的特性

    Validator 定义一个帮助器对象、属性和方法关联的 ValidationAttribute 特性中包含此类时,可使用此类验证这些项。...IsValid(Object, ValidationContext) 根据当前的验证特性验证指定的值。...StringConverter 提供用于字符串对象与其他表示形式之间实现相互转换的类型转换器。 SyntaxCheck 提供方法验证计算机名称和路径是否符合特定语法。 此类不能被继承。...容器是逻辑包含零个或多个组件的对象。 ICustomTypeDescriptor 提供为对象提供动态自定义类型信息的接口。...INestedContainer 提供嵌套容器的功能,嵌套容器逻辑可包含零个或多个其他组件,且这类容器由组件拥有。 INestedSite 提供检索组件的完全嵌套名称的能力。

    4.2K30

    图说C++对象模型:对象内存布局详解

    这是一种运行期多态,即指针唯有程序运行时才能知道所指的真正类型是什么。这种运行期决议,是通过虚函数表实现的。...一个派生如何在机器层面上塑造其父的实例呢?简单对象模型中,可以子类对象中为每个基对象分配一个指针。如下图: ?...overwrite虚函数,而是声明了自己新的虚函数,则该虚函数地址将扩充到虚函数表最后(vs中无法通过监视看到扩充的结果,不过我们通过取地址的方法可以做到,子类新的虚函数确实在物体的虚函数表末端...我们通过一张图更好地理解。 ? ? 虚基表的第二、第三...个条目依次为该类的最左虚继承、次左虚继承...的内存地址相对于虚基表指针的偏移值,这点我们在下面会验证。...D对象的内存构成,有以下几点: D对象内存中,基出现的顺序是:先是B1(最左),然后是B2(次左),最后是B(虚祖父) D对象的数据成员id放在B前面,两部分数据依旧以0分隔

    3.9K43

    认识vue中的Props

    什么是props Props 是 Vue 组件之间通信的一种方式,通过 Props,组件可以向组件传递数据,即:组件可以通过组件标签上的属性值把数据传递到组件中。...如何定义props Vue 组件中,需要通过配置 props 属性定义组件的 props。组件中添加 props 属性之后,就可以使用 props 选项接收从父组件传递的数据。...比如,一个商品列表页面中,可以定义一个 ProductList 的组件,组件 ProductItem 可以通过 Props 接收组件传递过来的产品信息,用于渲染商品列表。...这样可以很容易地实现在一个商品列表页面中渲染商品列表。 属性验证 前面提到过,vue中可以通过定义 props 对象的方式进行Props校验。...这些属性可以作为组件模板中的模板占位符或名和样式绑定。例如传递 CSS 名或事件监听器。组件内可以通过 $attrs 访问这些非 prop 特性。

    63820

    双亲委派模型:大厂高频面试题,轻松搞定

    让我们验证上面的加载规则 验证 1: 虚拟机会保证子类()方法执行之前,的()方法方法已经执行完毕 ? 输出结果 SSClass SuperClass init!...123 验证 2: 通过数组定义引用,不会触发此类的初始化(我的理解是数组的是Object) ?...这就是双亲委派模型的局限性了,级加载器无法加载加载器路径中的。 那么,这个问题如何解决呢?...文章前半段提到线程上下文类加载器可以通过 Thread.setContextClassLoaser() 方法设置,如果不特殊设置会从父继承,一般默认使用的是应用程序加载器 很明显,线程上下文类加载器让加载器能通过调用加载器加载...(或者自定义的然后塞到线程上下文中的),同时我们也查找到了厂商级的jar包中注册的驱动具体实现名,这样我们就可以成功的rt.jar包中的DriverManager中成功的加载了放在第三方应用程序包中的了同时

    61721

    Java魔法堂:加载机制入了个门

    二、执行java的那刻                            大家都知道通过java命令启动JVM和运行应用程序,但实际的流程又是如何的呢?   1....文件格式验证        首先对于被反复使用和验证过的验证过程是非必要的。可以通过 -Xverify:none 关闭验证,可缩短虚拟机加载的时间。       ...注意:字节码验证时会触发或所实现的接口的符号引用的解析(也就是会触发加载过程)。    4....执行链接阶段的解析阶段时,会对符号引用进行符号引用验证验证包括以下等内容:     a....或接口的解析   将D中的符号引用N解析为直接引用C,首先将N的全限定名传递给D的加载器去加载C,然后进过加载、验证、准备阶段,并因为字节码验证而加载实现的接口。

    94070

    2023百度面试真题

    其中验证、准备、解析三个部分统称为连接(Linking)。 Java 虚拟机设计团队把加载阶段中“通过一个的全限定名获取描述该类的二进制流”这个动作放到 Java 虚拟机外部去实现。...比便让程序应用自己决定如何取获取所需的实现这个动作的代码被称为“加载器”(Class Loader)。...RDB 保存 RDB 文件时进程唯一需要做的就是 fork 出一个进程,接下来的工作全部由进程做,进程不需要再做其他 IO 操作,所以 RDB 持久化方式可以最大化 redis 的性能....21、Redis 为什么使用 RDB 进行快照时会通过进程的方式进行实现?...Field c=cls.getDeclaredFields():获得某个的所有声明的字段,即包括 public、private和 proteced,但是不包括的声明字段 通过 class 对象获得一个方法对象

    19220

    全链路跟踪(压测)必备基础组件之线程上下文“三剑客”

    从结果上来看,线程中无法访问线程中设置的本地线程变量,那我们该如何来解决该问题呢?...为了解决上述问题,JDK引入了InheritableThreadLocal,即线程可以访问线程中的线程本地变量,更严谨的说法是线程可以访问创建线程时线程当时的本地线程变量,因为其实现原理就是创建线程将线程当前存在的本地线程变量拷贝到线程的本地线程变量中...size in case the VM cares */ this.stackSize = stackSize; /* Set thread ID */ tid = nextThreadID(); 线程是通过线程中通过调用...2.4 InheritableThreadLocal局限性 InheritableThreadLocal支持线程访问线程中设置的线程上下文环境的实现原理是创建线程时将线程中的本地变量值复制到线程...下面一一介绍其核心属性: AtomicReference capturedRef “捕获”的引用,根据下文的解读,该引用指向的数据结构包含了线程执行过程中,通过使用TransmittableThreadLocal

    90430

    全链路跟踪(压测)必备基础组件之线程上下文“三剑客”

    从结果上来看,线程中无法访问线程中设置的本地线程变量,那我们该如何来解决该问题呢?...为了解决上述问题,JDK引入了InheritableThreadLocal,即线程可以访问线程中的线程本地变量,更严谨的说法是线程可以访问创建线程时线程当时的本地线程变量,因为其实现原理就是创建线程将线程当前存在的本地线程变量拷贝到线程的本地线程变量中...size in case the VM cares */ this.stackSize = stackSize; /* Set thread ID */ tid = nextThreadID(); 线程是通过线程中通过调用...2.4 InheritableThreadLocal局限性 InheritableThreadLocal支持线程访问线程中设置的线程上下文环境的实现原理是创建线程时将线程中的本地变量值复制到线程...下面一一介绍其核心属性: AtomicReference capturedRef “捕获”的引用,根据下文的解读,该引用指向的数据结构包含了线程执行过程中,通过使用TransmittableThreadLocal

    67560

    全链路跟踪(压测)必备基础组件之线程上下文“三剑客”

    从结果上来看,线程中无法访问线程中设置的本地线程变量,那我们该如何来解决该问题呢?...为了解决上述问题,JDK引入了InheritableThreadLocal,即线程可以访问线程中的线程本地变量,更严谨的说法是线程可以访问创建线程时线程当时的本地线程变量,因为其实现原理就是创建线程将线程当前存在的本地线程变量拷贝到线程的本地线程变量中...size in case the VM cares */ this.stackSize = stackSize; /* Set thread ID */ tid = nextThreadID(); 线程是通过线程中通过调用...2.4 InheritableThreadLocal局限性 InheritableThreadLocal支持线程访问线程中设置的线程上下文环境的实现原理是创建线程时将线程中的本地变量值复制到线程...下面一一介绍其核心属性: AtomicReference capturedRef “捕获”的引用,根据下文的解读,该引用指向的数据结构包含了线程执行过程中,通过使用TransmittableThreadLocal

    61520
    领券