如何获取类或属性的自定义特性(Attribute)

问题说明:
在ActiveRecord或者其他的ORM等代码中, 我们经常可以看到自定义特性(Attribute)的存在(如下面的代码所示)
[PrimaryKey(PrimaryKeyType.Native, "PostId")]
    public int Id
    {
       ......
    }
 
 看似非常神秘的东西, 我们在什么场合需要使用它, 我们该如何使用它?
自定义特性(Attribute)在一些需要声明特定信息的时候非常有用, 如标识实体类属于那个表, 那个字段是否为主键,主键的数据库字段名是什么这些信息的时候就会派上用场, 使用的时候也是非常的简单.
解决方法:
1. 定义一个以Attribute结尾的特性类, 特性类继承自System.Attribute, 如下所示.
 [AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]
 public class PrimaryKeyAttribute : System.Attribute
 {
    .............
 
 
其中AttributeTargets是一个枚举的值, 可以是: Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate
 
2. 在需要使用的地方使用PrimaryKey自定义特性标签, 如下所示.
 [PrimaryKey(Column = "CustomerID", IsIdentity=false)]
  public int ID
  {
        .............
 
3. 为了获取自定义特性的信息, 需要反射的方式获取其数据, 首先我们定义一个类来存储这些信息, 如下所示
 public class PrimaryKeyModel
 {
  private readonly PropertyInfo propertyInfo;//外键的属性字段信息
  private readonly PrimaryKeyAttribute primaryKeyAtt;//外键的特性信息
  ................
 
  public static PrimaryKeyModel GetPrimaryKey(Type type)
  {
   PropertyInfo[] properties = type.GetProperties();
   foreach (PropertyInfo p in properties)
   {
    object[] keys = p.GetCustomAttributes(typeof(PrimaryKeyAttribute), true);
    if (keys.Length == 1)
    {
     return new PrimaryKeyModel(p, keys[0] as PrimaryKeyAttribute);
    }
   }
   return null;
  }
 
4. 在Customer类中获取其特性的信息代码如下
   string strReturn = string.Empty;    
   //Get PrimaryKey Name
   PrimaryKeyModel attribute= PrimaryKeyModel.GetPrimaryKey(this.GetType());
   if(attribute != null)
   {
    strReturn += string.Format("PrimaryKey Name:{0} IsIdentity:{1} Column:{2}\r\n",
     attribute.Property.Name, attribute.PrimaryKeyAtt.IsIdentity, attribute.PrimaryKeyAtt.Column);
   }
详细解释:
附件的实例中演示了如何获取类和属性的自定义特性, 类的特性包括获取实体类的表名称, 属性的特性包括获取外键的信息

附件代码下载:http://files.cnblogs.com/wuhuacong/TestPrimaryKeyAttribute.rar 

主要研究技术:代码生成工具、Visio二次开发、客户关系管理软件、病人资料管理软件、送水管理软件等共享软件开发
专注于Winform开发框架Web开发框架、WCF开发框架、微信门户开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  http://www.iqidi.com 
    

如何获取类或属性的自定义特性(Attribute)的更多相关文章

  1. C#提高--------------获取方法返回值的自定义特性(Attribute)

    .NET(C#):获取方法返回值的自定义特性(Attribute) 转载 2013年05月08日 10:54:42 1456 来自:http://www.cnblogs.com/mgen/archiv ...

  2. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  3. Runtime获取类的属性列表和方法列表

    Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...

  4. Java反射学习-1 - 反射获取类的属性,方法,构造器

    新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...

  5. .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性

    了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...

  6. 个人永久性免费-Excel催化剂功能第56波-获取Excel对象属性相关自定义函数

    之前零散开发过一些自定义函数获取Excel对象属性,此次再细细地把有价值的属性都一一给开发完成,某些场景下,有这些小函数还是可以比较方便地实现一些通过Excel界面没法轻松获取到的信息. 修复与更新 ...

  7. swift3.0 运行时获取类的属性

    //定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...

  8. 【转】EF 获取类的属性并排除特定属性(getType().GetProperties())

    当获取一个类型(class)的所有属性时,想排除指定属性,该如何操作? 比如:EF中一个实体类型UserEntity,通过反射获取这个类的属性时,想排除这个为映射的字段ID 使用以下方法即可! Pro ...

  9. 获取类的属性并排除特定属性(getType().GetProperties())

    当获取一个类型(class)的所有属性时,想排除指定属性,该如何操作? 比如:EF中一个实体类型UserEntity,通过反射获取这个类的属性时,想排除这个为映射的字段ID 使用以下方法即可! Pro ...

随机推荐

  1. 奇怪吸引子---LorenaMod1

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  2. 【Spark】Spark性能调优

    官网:http://spark.apache.org/docs/latest/tuning.html 1.引言 提到Spark与Hadoop的区别,基本最常说的就是Spark采用基于内存的计算方式,尽 ...

  3. 【T01】理解面向连接和无连接协议之间的区别

    1.面向连接和无连接指的是协议,本质区别在于:对于无连接协议来说,每个分组的处理都独立于其他的分组. 而对于面向连接的协议,协议实现维护了当前分组与后继分组有关的状态信息. 2.无连接就是指udp,分 ...

  4. 树莓派3中没有/dev/video0的解决方法(使用OpenCV编程调用树莓派摄像头的方法)

    一.问题 使用下列方法调用OpenCV编程调用树莓派摄像头时总是失败,提示调用Grabber的start()时失败. import org.bytedeco.javacpp.opencv_core; ...

  5. SNF快速开发平台MVC-EasyQuery-拖拽生成SQL脚本

    在之前介绍一下EasyQuery工具SNF开发平台WinForm-EasyQuery统计分析-效果-非常牛逼的报表查询工具 Winform开发框架之图表报表在线设计器-报表-SNF.EasyQuery ...

  6. appium 获取android 粘贴板上的内容

    appium 新版本增加了获取粘贴板的内容.如果使用appium旧版本,获取粘贴板的内容不是那么容易的,甚至百度谷歌各种搜,都无法找到合适的解决方法.新版本获取android 粘贴板内容就显得很容易了 ...

  7. Disruptor学习笔记

    前言 以前一直听说有Disruptor这个东西,都说性能很强大,所以这几天自己也看了一下. 下面是自己的学习笔记,另外推荐几篇自己看到写的比较好的博客: Disruptor——一种可替代有界队列完成并 ...

  8. CentOS 7 安装SVN并整合HTTP访问

    #!/bin/bash## -------------------------------------------------## 安装svn并整合http访问## ----------------- ...

  9. .NET CORE MYSQL 微信小程序 HTTPS 随笔

    今天一天都没有撸码,没写BUG没改BUG,整一天都在弄那个微信小程序的配置了..唉.. 一个项目用的微信小程序,界面做出来了,就等着AJAX取网络数据后再显示到界面上了,查了下文档, 小程序取网络数据 ...

  10. curl 伪装来路(referer)

    curl -e http://vip.hihi.com http://test.image.ok.com/parcel/201704/1491035345125_971038.jpg 1xx.8x.3 ...