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. js 复选框回显

    <div class="control-group"> <label class="control-label">客户状态:</l ...

  2. Numpy | 12 数组操作

    Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 一.修改数组形状 函数 描述 reshape 不改变数据 ...

  3. luogu_4762: [CERC2014]Virus synthesis

    洛谷_4762:[CERC2014]Virus synthesis 题目描述: 初始有一个空串,利用下面的操作构造给定串\(S\).\(len(S)\leq10^5\) 1: 串开头或末尾加一个字符. ...

  4. The Ultimate Guide to handling JWTs on frontend clients (GraphQL)

    转自:https://blog.hasura.io/best-practices-of-using-jwt-with-graphql/ hasura 团队关于jwt 的实践 JWTs (JSON We ...

  5. MVVM架构方式

    一.概念 ①常见的架构方式或者开发思想还有MVC.MVP和MVVM,参考文章:MVC,MVP 和 MVVM 的图示 ②MVC:视图(View),指用户界面:控制器(Controller),指业务逻辑: ...

  6. 封装好的observer.js,用于非父子组件传值,直接调用$on和$emit方法

    const eventList = {} const $on = (eventName,callback)=>{ if(!eventList[eventName]){ eventList[eve ...

  7. 微信小程序 自定义导航组件 nav头部 全面屏设计

    nav-dynamic 微信小程序自定义nav头部组件:适配全面屏设计: 实现功能 初始进入页面时,展示初始状态下的nav样式: 页面滚动时,监听页面滚动事件,展示滚动状态下的nav样式: 根据配置字 ...

  8. JavaScript语法-流程控制语句

    一.JavaScript特殊语法 JS特殊语法: 1. 语句以;结尾,如果一行只有一条语句则 ;可以省略 (不建议) 2. 变量的定义使用var关键字,也可以不使用 * 用: 定义的变量是局部变量 * ...

  9. windows自动修复失败,无法启动

    Windows10操作系统于2015年7月29日正式发布,此后,win10也就成了新上市的笔记本电脑或者台式机电脑的预装操作系统!win10系统给我们带了全新的体验,当然也带来了一定的烦恼!就拿win ...

  10. markdown转html

    今天临时要写接口文档,然后发现部门给的文档是markdown文件的,而接口文档是要html格式的,因此想直接把markdown转为html 这里我使用的是marked 首先初始化一个node项目 np ...