C# 反射通过GetCustomAttributes方法,获得自定义特性
http://blog.csdn.net/litao2/article/details/17633107
使用反射访问: 自定义属性的信息和对其进行操作的方法。
一、实例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);
//在4px的库内操作获取打印机
trv_LabelInvoice.Nodes.Clear();
string strText = string.Empty;
FieldInfo[] fields = typeof(EnumPrintName).GetFields();
foreach (FieldInfo field in fields)
{
strText = field.Name;
object[] arrAttributes = field.GetCustomAttributes(typeof(Attribute), true);
if (arrAttributes != null)
{
EnumAttribute objEnumAttribute = arrAttributes.FirstOrDefault(x => x.GetType().Name.Equals(typeof(EnumAttribute).Name)) as EnumAttribute;
if (objEnumAttribute != null)
{
strText = objEnumAttribute.Description;
}
}
if (trv_LabelInvoice.Nodes.IndexOfKey(field.Name) < 0)
{
trv_LabelInvoice.Nodes.Add(field.Name, strText);
}
}
C# 反射通过GetCustomAttributes方法,获得自定义特性的更多相关文章
- c#通过反射获取类上的自定义特性
c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...
- .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性
了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...
- Attribute自定义特性+Asp.net MVC中的filter详解
转载自:http://blog.csdn.net/wangyy130/article/details/44241957 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC ...
- 【.net 深呼吸】自定义特性(Attribute)的实现与检索方法
在.net的各个语言中,尤其是VB.NET和C#,都有特性这一东东,具体的概念,大家可以网上查,这里老周说一个非标准的概念——特性者,就是对象的附加数据.对象自然可以是类型.类型成员,以及程序集. 说 ...
- C# winform利用反射和自定义特性加载功能模块(插件式开发)
由于在实际的工作中, 碰见这样的一个问题: 一个软件, 销售给A客户 他需要所有功能, 但是销售给B客户, 他只需要其中的一部分, 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, ...
- C#反射与特性(七):自定义特性以及应用
目录 1,属性字段的赋值和读值 2,自定义特性和特性查找 2.1 特性规范和自定义特性 2.2 检索特性 3,设计一个数据验证工具 3.1 定义抽象验证特性类 3.2 实现多个自定义验证特性 3.3 ...
- C#提高--------------获取方法返回值的自定义特性(Attribute)
.NET(C#):获取方法返回值的自定义特性(Attribute) 转载 2013年05月08日 10:54:42 1456 来自:http://www.cnblogs.com/mgen/archiv ...
- NPOI+反射+自定义特性实现上传excel转List及验证
1.自定义特性 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public ...
- 反射_IsDefined判断方法上有自定义的标签
在.NET 4.0(当然也包括4.0以前的版本)下,用反射判断某个方法是否运用了自定义Attribute时,可以通过调用MethodInfo的IsDefined()方法进行确认.当然,IsDefine ...
随机推荐
- java用iText导出word文档
1.需要导入的jar包 2.导出word并下载其实是分两步的. 第一步是将需要导出的数据导出(上传)到服务器上 第二步是将服务器上的文档下载到本地 3. 第一步.上传文档 (1)设置响应信息以及构造上 ...
- 带参数的main函数
带参数的main函数 int main(int argc,char **argv) 或int main(int argc,char *argv[]) /*解析 依据<C程序设计语言(第二版. ...
- codeblocks在进行多线程出现phread问题
undefined reference to 'pthread_create' 出现这个错误是因为编译默认不会链接进程库. 可以选择用gcc进行编译 加上-lpthread 比如:gcc exampl ...
- IntelliJ IDEA For Mac 快捷键 [转]
Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...
- margin 依附与可见的内容,不能为margin而写margin
margin 依附于可见的内容,不能为margin而写margin <!DOCTYPE html><html><head><style> p{marg ...
- golang 面向对象
深入理解GO语言的面向对象_Golang_脚本之家 https://www.jb51.net/article/94030.htm 深入理解GO语言的面向对象 更新时间:2016年10月04日 10:4 ...
- bat masterNodeRun.bat
C:\> compare C:\> compare C:\>D:\cmd\wphp.bat C:\> compareReq -- :: TODO StartScript -- ...
- Hadoop createSnapshot和deleteSnapshot命令
概述 HDFS快照是文件系统的只读时间点副本. 可以对文件系统的子树或整个文件系统进行快照. 快照的一些常见用例是数据备份,防止用户错误和灾难恢复.HDFS快照的实现是高效的: 快照创建是即时的:成本 ...
- 剑指offer 面试48题
面试48题:题目:最长不含重复字符的子字符串 题:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长字符串的长度.假设字符串中只包含‘a’-‘z’的字符.例如,在字符串“arabcacfr ...
- Java多线程(Java总结篇)
Java总结篇:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上 ...