using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Reflection;
using System.Windows.Forms; using System.Threading; using System.Collections.Specialized; namespace Test123
{
public partial class Form1 : Form
{ public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } public class TestAttri : Attribute
{
public string JJ { get; set; }
} [TestAttri(JJ = "")]
public class ClassTest2 : ClassTest { } public abstract class ClassTest { } private void button3_Click(object sender, EventArgs e)
{
ClassTest obj = new ClassTest2();
Type type = obj.GetType();
TestAttri att = GetCustomAttribute<TestAttri>(type, false);
//(TestAttri)type.GetCustomAttributes(typeof(TestAttri), false).GetValue(0);
//或者 (TestAttri)obj.GetType().GetCustomAttributes(typeof(TestAttri), false)[0];
att.JJ = "rich"; //需要特别注意的地方:
//GetCustomAttributes 方法每次都返回新的实例
//每次获取 io 的 CustomAttributes 都是一个新的副本 MessageBox.Show(att.JJ); ((TestAttri)obj.GetType().GetCustomAttributes(typeof(TestAttri), false)[]).JJ = "jigjig";
MessageBox.Show(((TestAttri)obj.GetType().GetCustomAttributes(typeof(TestAttri), false)[]).JJ);
} private static Dictionary<MemberInfo, Object> _dicCache1 = new Dictionary<MemberInfo, Object>();
private static Dictionary<MemberInfo, Object> _dicCache2 = new Dictionary<MemberInfo, Object>(); public static TAttribute[] GetCustomAttributes<TAttribute>(MemberInfo member, Boolean inherit)
{
if (member == null)
{
return new TAttribute[];
} // 根据是否可继承,分属两个缓存集合
var cache = inherit ? _dicCache1 : _dicCache2; Object obj = null;
if (cache.TryGetValue(member, out obj))
{
return (TAttribute[])obj;
}
lock (cache)
{
if (cache.TryGetValue(member, out obj))
{
return (TAttribute[])obj;
}
var atts = member.GetCustomAttributes(typeof(TAttribute), inherit) as TAttribute[];
var att = atts == null ? new TAttribute[] : atts;
cache[member] = att;
return att;
}
} public static TAttribute GetCustomAttribute<TAttribute>(MemberInfo member, Boolean inherit)
{
var atts = member.GetCustomAttributes<TAttribute>(inherit);
if (atts == null || atts.Length < )
{
return default(TAttribute);
}
return atts[];
} } }

obj.GetType().GetCustomAttributes的更多相关文章

  1. Enum.GetUnderlyingType(obj.GetType())

    Enum.GetUnderlyingType(obj.GetType())获取保存枚举值的数据类型:

  2. MEF核心笔记(6)让 MEF 拥抱 AOP

    场景: 最近推荐同事在项目中使用起了 MEF,用其构建一个插件式的多人开发框架,因为该框架不是让我去设计了,所以对于 MEF 和 IOC 等概念不是很了解的同事,便会出现各种问题.接入 AOP 便是其 ...

  3. XML文件的读取、序列化和反序列化操作

    public class XmlHelper { //从xml中获取MsgType public static string XMLSelect(string XML) { XmlDocument x ...

  4. Unity在WPF中的应用

    1. 本文的实现类继承于IRepository using System; using System.Linq; using System.Linq.Expressions; using Zhang. ...

  5. C# GetType与typeof

    在反射和泛型中经常会使用到Type类,获取Type的最常用的方法是 obj.GetType(),和typeof(T).在获取泛型的type时有些小坑. public static void Main( ...

  6. WCF XmlSerializer GetType 反射类型 报错 解决方案

    为图省事,用现有的EF,和web一起使用一个Model类 当进行到 XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType()); 会报 ...

  7. default(T) 和 typeof 和 GetType()

    一.default(T) 在泛型编成中如果不限制T类型参数是值类型或引用类型的话 你程序内部可能会出现错误,因为值类型不允许NULL.所以default用来获取一个类型的默认值,对于值类型得到new ...

  8. C# 反射(GetType) 获取动态Json对象属性值的方法

    之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...

  9. C#/ASP.NET完善的DBHelper,配套Model生成器

    支持Oracle.MSSQL.MySQL.SQLite四种数据库,支持事务,支持对象关系映射:已在多个项目中实际使用. 没有语法糖,学习成本几乎为0,拿来即用. DBHelper类完整代码: usin ...

随机推荐

  1. Intellij IDEA如何生成JavaDoc

    JavaDoc是一种将注释生成HTML文档的技术. 1.使用javadoc命令生成文档 首先了解一下javadoc指令的用法 用法: javadoc [options] [packagenames] ...

  2. trait Monad:函数式编程类型系统本博客搜索关键字--类型升降

    trait Monad:函数式编程类型系统本博客搜索关键字--类型升降

  3. LVS是什么及作用?

    LVS的概念和重要性 LVS: 概念:是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统 作用:举例 像有三个小区,但是工作的时间和休息的时间不一样 ...

  4. scala 学习笔记--模式匹配

    1.switch java代码 switch (cause) { case ‘2‘ : dropTime=time; case ‘8’:case ‘9’ : case ‘10’:case ‘11’ : ...

  5. Longest Common Substring II SPOJ - LCS2 (后缀自动机)

    Longest Common Substring II \[ Time Limit: 236ms\quad Memory Limit: 1572864 kB \] 题意 给出\(n\)个子串,要求这\ ...

  6. vue基于iview树状表格,封装完善

    先安装iview后在使用 完善按钮不显示问题 ,当children过多时,点击不动问题等 封装 <template> <div :style="{width:tableWi ...

  7. [PHP] Laravel 5.5 使用备注

    laravel-5_5文档地址:https://laravelacademy.org/category/laravel-5_5 模板变量文档: https://laravelacademy.org/p ...

  8. 为什么vue组件中的data不是一个对象而是一个函数

    如果两个实例引用同一个对象,当其中一个实例的属性发生改变时,另一个实例属性也随之改变,只有当两个实例拥有自己的作用域时,才不会相互干扰. 这是因为JavaScript的特性所导致,在component ...

  9. mysql 层级结构查询

    描述:最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询, ...

  10. [技术博客]Pyqt中View类别容器和Widget类别容器的区别

    Pyqt中View类别容器和Widget类别容器的区别 简介 在beta迭代中,我们选择用pyqt5来重写alpha迭代中使用tkinter库编写的界面. ​ 按钮之类的与tkiner使用无异,在显示 ...