c#通过反射获取类上的自定义特性
本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html
下面这个是笔者在以前的一个项目中用到的。当时是为了在导出excel报表的时侯,通过自定义特性,包含一些可配置的特性在里面。具体的操作excel不是本文重点,本文不会多做说明。下面只写个示例,简单说明一下如何通过反射获取自定义特性。示例只在类和属性上使用了自定义特性。读者可以按照实际的项目需求,合理使用自定义特性。
1、实现实体自定义特性,继承自Attribute类
Code ///<summary> /// 自定义特性 属性或者类可用 支持继承 ///</summary> [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, Inherited =true)] publicclass EnitityMappingAttribute : Attribute { privatestring tableName; ///<summary> /// 实体实际对应的表名 ///</summary> publicstring TableName { get { return tableName; } set { tableName = value; } }
privatestring columnName; ///<summary> /// 中文列名 ///</summary> publicstring ColumnName { get { return columnName; } set { columnName = value; } } }
注释中我已经写的很清楚,自定义特性中的属性一个是实体实际对应的数据库表名,一个是对应的中文列名称。 2、在实体中使用自定义特性
Code ///<summary> /// 会员 ,实际的表名叫MemberInfo,并不是和实体名一致 ///</summary> [EnitityMapping(TableName="MemberInfo")] publicclass Member { privateint id; [EnitityMapping(ColumnName="关键字")] publicint Id { get { return id; } set { id = value; } }
privatestring userName; [EnitityMapping(ColumnName ="会员注册名")] publicstring UserName { get { return userName; } set { userName = value; } }
privatestring realName; [EnitityMapping(ColumnName ="会员真实名")] publicstring RealName { get { return realName; } set { realName = value; } }
privatebool isActive; ///<summary> /// 是否活跃 没有附加自定义属性 ///</summary> publicbool IsActive { get { return isActive; } set { isActive = value; } } }
3、显示自定义特性
Code class Program { ///<summary> /// 通过反射取自定义属性 ///</summary> ///<typeparam name="T"></typeparam> privatestaticvoid DisplaySelfAttribute<T>() where T:class ,new() { string tableName =string.Empty; List<string> listColumnName =new List<string>(); Type objType =typeof(T); //取属性上的自定义特性 foreach (PropertyInfo propInfo in objType.GetProperties()) { object[] objAttrs = propInfo.GetCustomAttributes(typeof(EnitityMappingAttribute), true); if (objAttrs.Length>) { EnitityMappingAttribute attr = objAttrs[] as EnitityMappingAttribute; if (attr !=null) { listColumnName.Add(attr.ColumnName); //列名 } } }
//取类上的自定义特性 object[] objs = objType.GetCustomAttributes(typeof(EnitityMappingAttribute), true); foreach (object obj in objs) { EnitityMappingAttribute attr = obj as EnitityMappingAttribute; if (attr !=null) {
tableName = attr.TableName;//表名只有获取一次 break; } } if (string.IsNullOrEmpty(tableName)) { tableName = objType.Name; } Console.WriteLine(string.Format("The tablename of the entity is:{0} ", tableName)); if (listColumnName.Count >) { Console.WriteLine("The columns of the table are as follows:"); foreach (string item in listColumnName) { Console.WriteLine(item); } } }
staticvoid Main(string[] args) { DisplaySelfAttribute<Member>(); //显示结果 Console.ReadLine(); } }
c#通过反射获取类上的自定义特性的更多相关文章
- C# 通过反射获取方法/类上的自定义特性
1.所有自定义属性都必须继承System.Attribute 2.自定义属性的类名称必须为 XXXXAttribute 即是已Attribute结尾 自定义属性QuickWebApi [Attribu ...
- php反射获取类和方法中的注释
通过php中的反射机制,获取该类的文档注释,再通过获取其所有的方法,获取方法的注释 所用到的主要类及其方法 ReflectionClass ReflectionClass::getDocComment ...
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
- java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包
首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性
了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...
- Java反射获取类和对象信息全解析
反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.f ...
- java反射-使用反射获取类的所有信息
在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...
- [转]java 通过反射获取类的全局变量、方法、构造方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.str; public class ZiFuChuan { ...
随机推荐
- 一个方便的shell命令,查看软件安装目录
查看软件安装路径:whereis phpfind / -name nginx.configfind 查找 / 从根目录 -name 文件查找
- 在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .
笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 声明:本文参考Strut ...
- Qt数据库(sqlite) — 总结
#include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...
- java_jdbc_基本连接池
MyDataSource实现封装连接池,MyConnection实现connection类,通过代理模式相互调用 package cn.itcast; import java.sql.*; publi ...
- [COCOS2DX]交叉编译实践+速度优化(vs2012修改win32代码+修改makefile+编译安卓项目包+部署安卓项目包到Eclipse+运行apk)
通过前面的部署过程可以知道cocos2dx的开发过程如下: 1.VS2012完成修改 2.因为指定了CPP文件位置,ndk可以通过jni方式完成C++文件的编译,运行以下命令完成proj.androi ...
- LINUX-----管道流及重定向
1.管道流 在linux中 | 符号代表管道流 用法:command1 | command2 第一个命令的标准输出将作为第二个命令的标准输入 例:cat a.txt | grep "abc ...
- matlab的legend用法
用Matlab画图时,有时候需要对各种图标进行标注,例如,用“+”代表A的运动情况,“*”代表B的运动情况. legend函数的基本用法是: LEGEND(string1,string2,string ...
- tcl/tk
http://blog.csdn.net/dulixin/article/category/365058 http://blog.csdn.net/dulixin/article/category/3 ...
- let 与 expr Shell运算比较 let强强胜出
Shell脚本中 整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 s 加 1 可以写作:let "s = $s + 1" 或者 s=`expr $s + 1'两 ...
- python备份脚本
备份制定文件到指定目录下,文件名以当前时间 思路: 1.指定备份的文件或目录 2.指定备份的目标路径 3.压缩备份名是当前日期和时间 4.使用标准的压缩命令 1.最简单的以日期时间为文件名 2.以日期 ...