如何获取类或属性的自定义特性(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. C# 远程服务器 创建、修改、删除 应用程序池 网站

    首先 C# 操作 站点 需要 引用Microsoft.Web.Administration.dll 文件,创建站点我们一般需要 远程服务的IP,网站名称.端口.物理路径:这里默认网站名称和应用程序池名 ...

  2. 如何使用IconFont 图标

    第一步:使用font-face声明字体 @font-face {font-family: 'iconfont'; src: url('iconfont.eot'); /* IE9*/ src: url ...

  3. CCNA实验3.单臂路由器

    拓扑图: 一.交换机配置 通过路由器子接口的方式实现vlan之间的路由. conf t vlan 10 vlan 20 int f0/1 switchport access vlan 10 int f ...

  4. How to measure IOPS for VMware

    http://blog.synology.com/blog/?p=2225 Executive SummaryThis article, intended towards IT Professiona ...

  5. Java 基础【17】 异常与自定义异常

    1.异常的分类 Throwable 是所有异常类的基类,它包括两个子类:Exception 和 Error. a. 错误 (Error) 错误是无法难通过程序来解决的,所以程序不应该抛出这种类型的对象 ...

  6. SCWS 中文分词_测试成功

    地址: http://www.xunsearch.com/scws/index.php

  7. swift学习之常量和变量

    常量:就是在初始化时(试试定义时不赋值会不会报错)赋予一个准确的值,能够在非常多地方直接用到,用letkeyword生命 变量:这个就不用说了,就是能够在下一秒你能够随便改变的量,用varkeywor ...

  8. 浅析Mysql的my.ini文件

    转载:http://hunanpengdake.iteye.com/admin/blogs/1647725 今天闲的蛋疼,没事想了解mysql,大家都知道在配置Mysql的过程中,my.ini非常重要 ...

  9. linux每日命令(33):diff命令

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  10. vs get set快捷键

    vs get set快捷键 光标放在空白处输入prop,然后tab两次,修改类型和名称即可