首页 > 学院 > 开发设计 > 正文

c#通过反射获取类上的自定义特性

2019-11-08 03:10:19
字体:
来源:转载
供稿:网友

下面这个是笔者在以前的一个项目中用到的。当时是为了在导出Excel报表的时侯,通过自定义特性,包含一些可配置的特性在里面。具体的操作excel不是本文重点,本文不会多做说明。下面只写个示例,简单说明一下如何通过反射获取自定义特性。示例只在类和属性上使用了自定义特性。读者可以按照实际的项目需求,合理使用自定义特性。

1、实现实体自定义特性,继承自Attribute类

   /// <summary>    /// 自定义特性 属性或者类可用  支持继承    /// </summary>    [AttributeUsage(AttributeTargets.PRoperty | AttributeTargets.Class, Inherited = true)]    public class EnitityMappingAttribute : Attribute    {        private string tableName;        /// <summary>        /// 实体实际对应的表名        /// </summary>        public string TableName        {            get { return tableName; }            set { tableName = value; }        }        private string columnName;        /// <summary>        /// 中文列名        /// </summary>        public string ColumnName        {            get { return columnName; }            set { columnName = value; }        }    }

注释中我已经写的很清楚,自定义特性中的属性一个是实体实际对应的数据库表名,一个是对应的中文列名称。2、在实体中使用自定义特性

 /// <summary>    /// 会员 ,实际的表名叫MemberInfo,并不是和实体名一致    /// </summary>    [EnitityMapping(TableName="MemberInfo")]     public class Member    {        private int id;        [EnitityMapping(ColumnName="关键字")]        public int Id        {            get { return id; }            set { id = value; }        }        private string userName;        [EnitityMapping(ColumnName = "会员注册名")]        public string UserName        {            get { return userName; }            set { userName = value; }        }        private string realName;        [EnitityMapping(ColumnName = "会员真实名")]        public string RealName        {            get { return realName; }            set { realName = value; }        }        private bool isActive;        /// <summary>        /// 是否活跃  没有附加自定义属性        /// </summary>        public bool IsActive        {            get { return isActive; }            set { isActive = value; }        }    }

3、显示自定义特性

   class Program    {        /// <summary>        /// 通过反射取自定义属性        /// </summary>        /// <typeparam name="T"></typeparam>        private static void 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>0)                {                    EnitityMappingAttribute attr = objAttrs[0] 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 > 0)            {                Console.WriteLine("The columns of the table are as follows:");                foreach (string item in listColumnName)                {                    Console.WriteLine(item);                }            }        }        static void Main(string[] args)        {            DisplaySelfAttribute<Member>(); //显示结果            Console.ReadLine();        }    }ps:在获取自定义特性的地方,其实就是利用了GetCustomAttributes方法,这个没什么好说的。在实际开发的时候,通过反射的特性可以省却我们很多繁琐的事情,真像那句话说的,“反射反射,程序员的快乐”。不过,反射的性能问题还是需要格外注意的,比如,今天上午看到老赵的“Attribute操作的性能优化方式”才发现原来还有那么多内涵。  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表