C#自定义属性

描述

属性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等)相关联。属性与程序实体关联后,即可在运行时使用名为“反射”的技术查询属性。

属性以两种形式出现:

  • 一种是在公共语言运行库 (CLR) 中定义的属性。
  • 另一种是可以创建的用于向代码中添加附加信息的自定义属性。此信息可在以后以编程方式检索。

自定义属性的作用

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

自定义属性的实现步骤

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来获取属性值。

时间: 2024-10-27 02:47:47

C#自定义属性的相关文章

Jquery怎么获取select选中项 自定义属性的值

Jquery如何获取select选中项 自定义属性的值? HTML code <select id="ddl" onchange="ddl_change(this)"">    <option value="100" emoney="12" gmoney="12">日卡</option>    <option value="102" e

13.按比例显示图片、自定义属性、测量

有时候服务器返回的图片有可能宽高是不一样的,所以需要按照一定宽高比例去显示,修改专题界面 自定义属性 <resources> <declare-styleable name="com.itheima.googleplay.view.RatioLayout"> <attr name="ratio" format="float"></attr> </declare-styleable> &l

Spring Boot? 配置文件详解:自定义属性、随机数、多环境配置等

自定义属性与加载 我们在使用Spring Boot的时候,通常也需要定义一些自己使用的属性,我们可以如下方式直接定义: application-dev.yml com.didispace.blog: name: 程序猿DD title: Spring Boot教程 desc: ${com.didispace.blog.name}正在努力写<${com.didispace.blog.title}> # 随机字符串 value: ${random.value} # 随机int number: ${

关于Android attrs 自定义属性的说明

写个自定义控件时经常要自定义一些自己的属性,平时用的都是那几个,今天就顺便一起总结一下这个东东吧- 一.定义:属性的定义都在attrs.xml文件里面: 二.读取:通过都是通过TypedArray去读取的,要获取TypedArray都是通过context.obtainStyledAttributes去获取的,它有几个重载方法,一般形如: TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Custom

HTML5 自定义属性 dataset

dataset 属性的 值是 DOMStringMap 的一个实例,也就是一个名值对儿的映射. 在这个映射中,每个 data-name 形式 的属性都会有一个对应的属性,只不过属性名没有 data-前缀 //本例中使用的方法仅用于演示 var div = document.getElementById("myDiv"); //取得自定义属性的值 var appId = div.dataset.appId; var myName = div.dataset.myname; //设置值 d

Android 自定义属性

Android自定义属性我们自定义控件中是经常用到的,自定义属性可以在我们的xml布局文件中使用,这样可以减少代码量,也增加了代码的健壮性和可阅读性.所以,在掌握自定义控件之前要首先掌握好怎样自定义属性. 首先来看看自定属性都有哪些? values/attrs.xml 中可定义的属性类型有如下几个: 1. reference:参考某一资源ID.<attr name = "background" format = "reference" /> 2. col

自定义组合控件和在自定义控件中使用自定义属性

今天,整理了一下我平时的笔记,写一个比较简单的自定义组合控件,仅供小白参考,大神请绕道,希望能够对大家有一些帮助 首先,得明白为什么我们需要自定义组合控件,它是因为原有控件并不能满足开发的需求,或者说并不能达到我们想要的一种效果,这个时候,就需要我们自己定义一些控件,以达到目的 ![先来看一下效果](http://img.blog.csdn.net/20160716224219109) 个人总结自定义控件的步骤: 1.先写一个布局,这里我用的是一个相对布局,我这里的相对布局就是根布局了 <?xm

自定义控件基础02_下拉刷新_侧拉菜单_自定义属性

自定义控件02 自定义控件 ①,纯粹自定义绘制 ②,在原生的基础上追加功能. 1,下拉刷新功能(继承ListView追加功能)(下拉刷新,加载更多,两个功能) 1.1 下拉刷新 ①创建一个类,继承ListView 创建自定义适配器,设置数据 额外:自定义控件会放到view包下 ②自定义控件的头(即下拉的时候显示的view) 推荐名称initHeaderView();在构造方法中初始化这个头 this.addHeaderView()//添加一个头布局的控件,在listView顶部添加一个头 头部u

【自定义控件】自定义属性

做 Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速 有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方提供的那些组件一样用xml 来定义他的属性呢?现在我们就来讨论一下他的用法. 一.在res/values文件下定义一个attrs.xml文件,代码如下: <?xml version="1.0" encoding="utf-8"?>  <resour

Android自定义控件之自定义属性的添加 -(2)

还是前面例子中的问题,如果想在xml中设置球的半径,应该怎么办?我们先了解下自定义属性的知识. 一.属性文件中format 首先我们要查看values目录下是否有attrs.xml,如果没有要创建一个. format可选项 reference //引用 color boolean dimension  /尺寸 float integer string fraction //百分数,如200% 下面再自定义几个属性,在attrs.xml文件中,如下 <?xml version="1.0&qu