C# 反射通过GetCustomAttributes方法,获得自定义特性

来源:互联网 发布:逆战游戏数据异常 编辑:程序博客网 时间:2024/06/03 17:37

使用反射访问自定义属性信息和对其进行操作的方法

一、实例1

1、代码:


 如:System.Attribute[] attrs=System.Attribute.GetCustomAttributes(typeof(FirstClass));

namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            PrintAuthorInfo(typeof(FirstClass));            PrintAuthorInfo(typeof(SecondClass));            PrintAuthorInfo(typeof(ThirdClass));            Console.ReadKey();        }        private static void PrintAuthorInfo(System.Type t)        {            System.Console.WriteLine("\n类型的 System.Type 对象是:{0}", t);            System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t);  //反射获得用户自定义属性            foreach (System.Attribute attr in attrs)            {                if (attr is Author)                {                    Author a = (Author)attr;                    System.Console.WriteLine("   名称:{0}, 版本: {1:f}", a.GetName(), a.version);                }            }        }    }    [System.AttributeUsage(System.AttributeTargets.Class |                       System.AttributeTargets.Struct,                       AllowMultiple = true)    ]//自定义特性类(应用特性的程序元素(是类或结构),程序元素可以指定多个特性)    public class Author : System.Attribute    {        string name;        public double version;        public Author(string name)        {            this.name = name;            version = 1.0;  // Default value        }        public string GetName()        {            return name;        }    }    [Author("H. Ackerman")]    public class FirstClass    {        // ...    }    // No Author attribute    public class SecondClass    {        // ...    }    [Author("H. Ackerman"), Author("M. Knott", version = 2.0)]    public class ThirdClass    {        //程序元素可以指定多个特性    }}


 

2、效果:

 

 

二、实例2

1、代码

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Linq.Expressions;using System.Collections.Specialized;using System.Reflection;using System.Data.Linq.Mapping;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            PropertyInfo[] propertys = typeof(FirstClass).GetProperties();//返回FirstClass的所有公共属性            if (propertys != null && propertys.Length > 0)            {                foreach (PropertyInfo p in propertys)                {                    object[] objAttrs = p.GetCustomAttributes(typeof(ColumnAttribute), true);//获取自定义特性                    //GetCustomAttributes(要搜索的特性类型,是否搜索该成员的继承链以查找这些特性)                    if (objAttrs != null && objAttrs.Length > 0)                    {                        ColumnAttribute attr = objAttrs[0] as ColumnAttribute;                        Console.WriteLine("自定义特性Name:"+p.Name+", 元数据:"+attr);                    }                };            }            Console.ReadKey();        }    }    public class FirstClass    {        private int _newsid = 0;        /// <summary>        /// 主键        /// </summary>        [Column(Name = "NewsId", DbType = "int", IsPrimaryKey = true, CanBeNull = false, IsDbGenerated = true)]        public int NewsId        {            get            {                return this._newsid;            }            set            {                this._newsid = value;            }        }        private string _newsimage = string.Empty;        /// <summary>        /// 资讯标题图片        /// </summary>        [Column(Name = "NewsImage", DbType = "varchar", IsPrimaryKey = false, CanBeNull = false, IsDbGenerated = false)]        public string NewsImage        {            get            {                return this._newsimage;            }            set            {                this._newsimage = value;            }        }    }}


2、效果

 

 

其他:

FullName(获得System.Type的完全限定名,包括命名空间)


三、实例3 (设置指定实例 属性 的值

            FirstClass fClass = new FirstClass();            PropertyInfo pInstance = typeof(FirstClass).GetProperty("NewsId");//搜索具有指定名称的公共属性            pInstance.SetValue(fClass, 11, null);//设置指定实例 属性 的值            Console.WriteLine("新闻ID:"+fClass.NewsId);            Console.WriteLine("新闻图片:"+fClass.NewsImage);


 

 

1 0
原创粉丝点击