自定义属性的作用

有时候我们需要给一个类或者类中的成员加上一些属性或者附加信息,让类或者变量的功能更明确可控制的细粒度更高,打个简单的比方:数据库里面的一张表,表中的每一个字段都有很多属性,如是否主键,默认值,注释信息等等,我们在编写实体类的时候,如何表示这些信息呢?通过自定义属性可以实现。

自定义属性的实现步骤

我说了不算,权威说了算:

  1. 声明一个类,并将 AttributeUsageAttribute 属性应用到该类中。类的名称即为新属性的名称
  2. 声明该类从 System.Attribute 继承:
  3. 定义 Private 字段来存储属性值:
  4. 需要时,请为属性创建构造函数:
  5. 为属性 (Attribute) 定义方法、字段和属性 (Property):

实例一个:

属性类(和相关枚举)

/// <summary>
    /// 数据库字段的用途。
    /// </summary>
    public enum EnumDBFieldUsage
    {
        /// <summary>
        /// 未定义。
        /// </summary>
        None = 0x00,
        /// <summary>
        /// 用于主键。
        /// </summary>
        PrimaryKey = 0x01,
        /// <summary>
        /// 用于唯一键。
        /// </summary>
        UniqueKey = 0x02,
        /// <summary>
        /// 由系统控制该字段的值。
        /// </summary>
        BySystem = 0x04
    }

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
    public class DBFieldAttribute:Attribute
    {
        EnumDBFieldUsage m_usage;
        string m_strFieldName;
        string m_strDescription;
        object m_defaultValue;

public DBFieldAttribute(string strFieldName,object defaultValue,EnumDBFieldUsage usage,string strDescription)
        {
            m_strFieldName = strFieldName;
            m_defaultValue = defaultValue;
            m_usage = usage;
            m_strDescription = strDescription;
        }

public DBFieldAttribute(string fieldName) : this(fieldName,null, EnumDBFieldUsage.None,null)
        { }

public DBFieldAttribute(string fieldName, EnumDBFieldUsage usage) : this(fieldName, null,usage, null)
        { }

// 获取该成员映射的数据库字段名称。
        public string FieldName
        {
            get
            {
                return m_strFieldName;
            }
            set
            {
                m_strFieldName = value;
            }
        }

// 获取该字段的默认值
        public object DefaultValue
        {
            get
            {
                return m_defaultValue;
            }
            set 
            {
                m_defaultValue = value;
            }
        }
    }

此代码说明了如何制作自定义属性类。其实跟一般的类的区别就是此类继承自Attribute,加上AttributeUsage是属性上的属性,是可选的。

 

数据访问层实体类:

class DalObj
    {
        string m_strTableName;
        int m_nID;
        string m_strName;
        string m_password;

public DalObj(string strTableName)
        {
            m_strTableName = strTableName;
        }

[DBField("id",EnumDBFieldUsage.PrimaryKey)]
        public int ID
        {
            get { return m_nID; }
            set { m_nID = value; }
        }

[DBField("name",DefaultValue="游客")]
        public string Name
        {
            get { return m_strName; }
            set { m_strName = value; }
        }

[DBField("pwd")]
        public string PassWord
        {
            get { return m_password; }
            set { m_password = value; }
        }
    }

此代码说明了如何使用自定义的属性。有两点需要注意的地方

第一:类名可以跟自定义的类名一样,也可以加上或减去后面的Attribute,本例子中就是使用的时候跟自定义的类名减少了“Attribute”。

第二:属性参数填写方法,如果自定义属性类(例子中DBFieldAttribute)自己的构造函数带参数,那么这些参数是必选的,可以重载构造函数以满足不同组合,必选参数填完之后,可以继续给自定义属性类中的公共成员带命名地赋值,如例子中的 DefaultValue="游客" 一句就是命名参数。

遍历自定义属性的代码:

            DalObj dalObj = new DalObj("users");
            StringBuilder sb = new StringBuilder();
            foreach (PropertyInfo proInfo in dalObj.GetType().GetProperties())
            {
                object[] attrs = proInfo.GetCustomAttributes(typeof(DBFieldAttribute), true);
              if (attrs.Length == 1)
              {
                  DBFieldAttribute attr = (DBFieldAttribute)attrs[0];
                  sb.Append(attr.FieldName + ":" + (attr.DefaultValue == null ? "null" : attr.DefaultValue.ToString()) + "\r\n");
              }
            }
            MessageBox.Show(sb.ToString());

此代码说明了如何检索自定义属性的值,主要用到了GetCustomAttributes来获取属性值。

C#中自定义属性的例子相关推荐

  1. Android中自定义属性(attrs.xml,TypedArray的使用)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  2. tensorflow中的seq2seq例子为什么需要bucket? 有关tensorflow 的sequence2sequence例子,为什么需要用到buckets,rnn不是可以处理任意长度的数据吗

    tensorflow中的seq2seq例子为什么需要bucket? 有关tensorflow 的sequence2sequence例子,为什么需要用到buckets,rnn不是可以处理任意长度的数据吗 ...

  3. Tag recommendaion... 论文中的小例子,使用HOSVD算法推荐

    Tag recommendaion- 论文中的小例子,使用HOSVD算法推荐 有实例,有代码, https://www.cnblogs.com/pertinencec/p/10066322.html

  4. Java黑皮书课后题第6章:**6.24(显示当前日期和时间)程序清单2-7显示当前时间。改进这个例子,显示当前的日期和时间。程序清单6-12中的日历例子可以提供一些如何提供如何求年月日的思路

    6.24(显示当前日期和时间)程序清单2-7显示当前时间.改进这个例子,显示当前的日期和时间.程序清单6-12中的日历例子可以提供一些如何提供如何求年月日的思路 题目 题目描述 2-7显示当前时间 从 ...

  5. FFMpeg中apiexample.c例子分析——编码分析

    FFMpeg中apiexample.c例子分析--编码分析apiexample.c例子教我们如何去利用ffmpeg库中的api函数来自己编写编解码程序. (1)首先,main函数中一开始会去调用avc ...

  6. FFMpeg中apiexample.c例子分析——解码分析

    FFMpeg中apiexample.c例子分析--解码分析 收藏 我们直接从 video_decode_example() 函数开始讲,该函数实现了如何去解码一个视频文件,以 .mpeg 文 件为例. ...

  7. jquery中ajax完整例子get,jq的ajax方法,jquery中ajax完整例子

    jq的ajax方法,jquery中ajax完整例子 相较与js异步对象的繁琐,jq的ajax对象结构更加清晰 一:ajax对象简述 ajax(Asynchronous JavaScript and X ...

  8. 妙味css3课程---1-1、css中自定义属性可以用属性选择器么

    妙味css3课程---1-1.css中自定义属性可以用属性选择器么 一.总结 一句话总结:可以的. 1.如何实现用属性选择器实现a标签根据href里面含有的字段选择背景图片? p a[href*=te ...

  9. C++ Templates 中的一个例子

    C++ Templates <The complete guide> 中的一个例子: 一个模板基类 template<class T> class Base { public: ...

最新文章

  1. python traceback安装_Python错误:Traceback (most recent call last):感觉是软件出了问题
  2. python 自动化框架打包_听说很多人都不会打包,教你Python实现前端自动化打包部署!...
  3. asp.net 上一条和下一条记录的显示
  4. Android SDK Manager国内无法更新的解决方案
  5. redis高可用原理及demo
  6. 数字图像处理:第十五章 图象分割
  7. Fikker反向代理服务器的网站缓存加速/网站加速基础教程
  8. Kittle工具抽取文件出现乱码的情况解决方法
  9. 程序员眼中的编程语言
  10. .NET Windows服务开发流程
  11. Ancient Knight(打造Windows Mobile平台最专业的游戏修改器)
  12. Unity 实现人物移动
  13. lh服务器注册,登不进去的人请看这里:LH服无法登录问题官方解释
  14. 如何快速批量修改图片名称?
  15. 免费分享一个最完美的英语学习素材 Englishpod
  16. 普通路由器和聚合路由器的区别
  17. spark输出rdd数据_Spark中RDD的详解
  18. 计算机考研英语一和英语二的区别,考研英语一和英语二的区别,考研党知道了吗?...
  19. 零基础入门CV赛事- 街景字符编码识别
  20. STM32利用定时器1控制LED闪烁

热门文章

  1. 牛客练习赛40 A.小D的剧场
  2. 借条的注意事项,上面不能有这3个字
  3. Spring Cloud之网关搭建
  4. XO Wave-数字音频编纂软件
  5. 在Google Android模拟器中使用SD卡(命令行和eclipse环境)
  6. SVN被锁定的几种解决方法
  7. 关于svn更新失败,clearup异常解决
  8. 解决无法安装cnpm,cnpm卡顿问题
  9. asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
  10. Navicat连接MySQL8.0出现乱码的解决方案