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. AppDomain.Unload_MarshalByRefObject

    internal string GetClassInfo(string assemblyName, string className, string strField) { string ret = ...

  2. 爬虫-retrying用法

    文档:https://pypi.org/project/retrying/ 安装 pip install retrying 设置最大重试次数 # coding=utf-8 import request ...

  3. WGS84与CGCS2000坐标系

    1.WGS84,WGS是世界大地测量系统World Geodetic System的缩写,84是说此坐标系是1984年建立的:   2.自上世纪60年代,美国军方相继推出WGS60.WGS66.WGS ...

  4. 第08组 Alpha冲刺(5/6)

    队名:955 组长博客:https://www.cnblogs.com/cclong/p/11898112.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...

  5. UIAutomatorViewer、Inspector获取元素信息

    一.UIautomatorViewer 它是Android SDK的一个工具,如果安装了 Android SDK,就可以在cmd窗口直接输入uiautomatorviewer打开. 点击左上角的第二个 ...

  6. 获取Android包名和activity名

    个人主要用2个方法. 方法1:pm list package 方法2: windows:adb shell logcat | findstr START; linux: adb shell logca ...

  7. Why you need to understand garbage collection

    Why you need to understand garbage collection I’ve been interviewing lots of C# developers recently, ...

  8. fluid.io.load_inference_model 载入多个模型的时候会报错 -- [paddlepaddle]

    将多个模型部署到同一个服务时,会出现stack错误. 原因是program为全局. 改成这样,可以解决. solved by myself. for those who need it:use a n ...

  9. [转]Oracle左连接、右连接、全外连接以及(+)号用法

    原文地址:https://www.cnblogs.com/hehaiyang/p/4745897.html 阅读目录 1.准备工作 2.左外连接(LEFT OUTER JOIN/ LEFT JOIN) ...

  10. groupby 的妙用(注意size和count)

    Pandas的groupby()功能很强大,用好了可以方便的解决很多问题,在数据处理以及日常工作中经常能施展拳脚. 今天,我们一起来领略下groupby()的魅力吧. 首先,引入相关package: ...