C#中自定义属性的例子
自定义属性的作用
有时候我们需要给一个类或者类中的成员加上一些属性或者附加信息,让类或者变量的功能更明确可控制的细粒度更高,打个简单的比方:数据库里面的一张表,表中的每一个字段都有很多属性,如是否主键,默认值,注释信息等等,我们在编写实体类的时候,如何表示这些信息呢?通过自定义属性可以实现。
自定义属性的实现步骤
我说了不算,权威说了算:
- 声明一个类,并将 AttributeUsageAttribute 属性应用到该类中。类的名称即为新属性的名称
- 声明该类从 System.Attribute 继承:
- 定义 Private 字段来存储属性值:
- 需要时,请为属性创建构造函数:
- 为属性 (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#中自定义属性的例子的更多相关文章
- 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击
CSRF (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下 ...
- Layer 中自定义属性的动画
原文:http://objccn.io/issue-12-2/ Layer 中自定义属性的动画 默认情况下,CALayer 及其子类的绝大部分标准属性都可以执行动画,无论是添加一个 CAAni ...
- Android中自定义属性(attrs.xml,TypedArray的使用)
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
- break在switch中的使用例子
/* Name:break在switch中的使用例子 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月21日 03:16:52 Description:以 ...
- [Spark][Python][DataFrame][RDD]DataFrame中抽取RDD例子
[Spark][Python][DataFrame][RDD]DataFrame中抽取RDD例子 sqlContext = HiveContext(sc) peopleDF = sqlContext. ...
- (二)Hadoop例子——运行example中的wordCount例子
Hadoop例子——运行example中的wordCount例子 一. 需求说明 单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为 MapReduce版"Hello ...
- Android学习笔记_49_Android中自定义属性(attrs.xml,TypedArray的使用)
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
- 妙味css3课程---1-1、css中自定义属性可以用属性选择器么
妙味css3课程---1-1.css中自定义属性可以用属性选择器么 一.总结 一句话总结:可以的. 1.如何实现用属性选择器实现a标签根据href里面含有的字段选择背景图片? p a[href*=te ...
- “独立”OpenVINO R2019_2 版本中的“super_resolution_demo”例子的,解决由于 R2019_1到R2019_2 升级造成的问题
OpenVINO提供了丰富的例子,为了方便研究和使用,我们需要将这些例子由原始的demo目录中分离出来,也就是“独立”运行,这里我们选择了较为简单的super_resolution_demo来说明问题 ...
随机推荐
- Dom4j完整教程,操作XML教程
目录 1.DOM4J简介 2.XML文档操作1 2.1.读取XML文档: 2.2.获取根节点 2.3.. 新增一个节点以及其下的子节点与数据 2.4. 写入XML文件 2. 5. 遍历xml节点 2. ...
- Chrome 好玩的插件
1 Lastpass : 用来把往各个网址的密码云端存储. 2 EditThisCookie : 查看网页的Cookie 3 Postman Interceptor : 用来配合Postman 进 ...
- 转:关于 OGRE 与 OSG 的简单比较
1 前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<Ope ...
- 使用std::find_if提取序列容器的子串
一个需求是这样的,一个vector容器中,我需要提取满足一定条件的元素的序列.就比如,一个树形结构,我把该接口拍扁成vector容器,每个节点都有一个惟一ID. 以下就是根据特定的ID查找节点下的子节 ...
- ios中Pldatabase的用法
将PLDATABASE加入到工程 下载PLDatabase 的dmg文件 将PLDatabase的framework复制到工程根目录在工程中加入该framework使用该framework进行数据库操 ...
- APP缓存数据线程安全问题
问题 一般一个 iOS APP 做的事就是:请求数据->保存数据->展示数据,一般用 Sqlite 作为持久存储层,保存从网络拉取的数据,下次读取可以直接从 Sqlite DB 读取.我们 ...
- LC_ALL=C的含义
在很多的shell脚本中,我们经常会看见某一句命令的前面有一句“LC_ALL=C” SAR_CMD="LC_ALL=C sar -u -b 1 5 | grep -i average &qu ...
- Python学习笔记(十一)—— 函数式编程
一.函数式编程理念 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变 ...
- HDU 1258 Sum It Up (DFS)
Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- 【SqlServer】SQL Server的常用函数
字符串函数 SubString():用于截取指定字符串的方法.该方法有三个参数:参数1:用于指定要操作的字符串.参数2:用于指定要截取的字符串的起始位置,起始值为 1 .参数3:用于指定要截取的长度. ...