用自定义属性实现必需字段的检查

简介: 在持久化类时,一个对象需要保存到数据库中表,数据库中的表在设计时会根据一些设计范式的要求定义一些必要的字段这样,在持久化时,就必须检查一下这些与数据库映射字段是否已经赋值了,如果没有,则不能保存到数据库中,这时应弹出对话框来提示,以防止错误异常的发生. using System;using System.Collections.Generic;using System.Text;usi
在持久化类时,一个对象需要保存到数据库中表,数据库中的表在设计时会根据一些设计范式的要求定义一些必要的字段
这样,在持久化时,就必须检查一下这些与数据库映射字段是否已经赋值了,如果没有,则不能保存到数据库中,这时应弹出
对话框来提示,以防止错误异常的发生.
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Reflection;
using  System.Diagnostics;
using  System.Windows.Forms;

namespace  desz
{
    
///   <summary>
    
///  这是我的第一个属性,测试文档,这个属性只能用于Field
    
///   </summary>
    [AttributeUsage(AttributeTargets.Field, Inherited  =   true )]
    
public   class  cxyAttrib : System.Attribute
    {
        
string  name;
        
string  createdate;
        
bool  IsRequired;

        
public  cxyAttrib()
        {
        }
        
public  cxyAttrib( string  t_date, string  t_name, bool  t_req)
        {
            createdate 
=  t_date;
            name 
=  t_name;
            IsRequired 
=  t_req;
        }



        
///   <summary>
        
///  当前属性的名称
        
///   </summary>
         public   string  Name
        {
            
get  {  return  name; }
            
set  { name  =  value; }
        }
        
///   <summary>
        
///  创建日期
        
///   </summary>
         public   string  CreateDate
        {
            
get  {  return  createdate; }
            
set  { createdate  =  value; }
        }
        
///   <summary>
        
///  是否必须
        
///   </summary>
         public   bool  Required
        {
            
get  {  return  IsRequired; }
            
set  { IsRequired  =  value; }
        }

    }

    
public   class  MyPeriseObject
    {
    
// 在这里设置那一些字段是必须的,作为以后检查的根据
        [cxyAttrib(CreateDate  =   " 2007-10-9 " , Name  =   " object id " , Required  =   true )]
        
private   string  id;
        [cxyAttrib(CreateDate 
=   " 2007-10-8 " , Name  =   " object name " , Required  =   true )]
        
private   string  name;
        [cxyAttrib(CreateDate 
=   " 2007-10-7 " , Name  =   " object color " , Required  =   false )]
        
private   string  color;

    
// 以下的就是属性了
      
        
public   string  ID
        {
            
get  {  return  id; }
            
set  { id  =  value; }
        }

       
        
public   string  Name
        {
            
get  {  return  name; }
            
set  { name  =  value; }
        }

      
        
public   string  Color
        {
            
get  {  return  color; }
            
set  { color  =  value; }
        } 

    }

    
///   <summary>
    
///  用来检查当前物体在持久化之前所有的属性是否都已经全部赋值了
    
///   </summary>
     public   class  CheckAttribute
    {
        
public   static   void  Run()
        {
            MyPeriseObject componet1 
=   new  MyPeriseObject();
            componet1.ID 
=   " 100 " ;
            Type currentType 
=  componet1.GetType();
            FieldInfo[] fi 
=  currentType.GetFields(BindingFlags.NonPublic  |  BindingFlags.Instance); // 找出当前对type中有那些fields



            
foreach  (FieldInfo tf  in  fi)
            {
        
// 找出赋在这些field上的自定义属性
                cxyAttrib tpcxy  =  (cxyAttrib)Attribute.GetCustomAttribute(tf,  typeof (cxyAttrib));
                
if  (tpcxy  !=   null )
                    
if  (tpcxy.Required)  // 检查设置时值是否是必须,并检查当前值是否是必须
                         if  (tf.GetValue(componet1)  ==   null )
                        {
                            Debug.WriteLine(
" 必要属性没有被设置值 " );
                            MessageBox.Show(tf.Name 
+   " 是一个必要属性 但是没有被设置值 " );
                        }
                        
else
                        {
                            MessageBox.Show(tf.Name 
+   " 的属性值是: "   +  tf.GetValue(componet1).ToString());
                        } 
            }

        }
    }
}
 
相关文章
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
271 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
663 219
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
353 34
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1589 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
897 61
|
7天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
295 140