asp.net 自定义特性
今天看张子阳的.net中的反射(反射特性)一文,觉得反射配合自定义的特性确实还挺有用,之前看书、看博客之后好多心血来潮敲的代码随便往桌面上一放,时间一久,连自己也分不清它们是干嘛的了,然后就是删除,虽然写过不少,看的也够多,但什么也没留下,总感觉心里空荡荡的!所以,决定在这里记录下来练习代码。
先贴定义的特性类的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; namespace AttributeTest
{
[Serializable]
[ComVisible(true)]
/*AttributeUsage顾名思义:这个特性用在什么地方,是用在类上呢,还是用在方法上,仰或是程序集上?
*能用在什么地方是其参数(AttributeTargets)决定滴(为什么?)。
* ArributeTargets是个枚举,正如下面一行代码所示,指定了RecordAttributes类(因为其继承了Attribute),做为特性用在Class和Method上。
* AllowMultiple参数呢?顾名思义是可以用于多行,不明白?好吧看看这个:
[Record("小小威", "修改了该类改动XXX", "2013-7-18 14:24:32")]
[Record("记忆中的马肠河", "修改了该类改动XXX", "2013-8-18 18:24:32")]
假如我们这个特性类创建好了,而且指定了AllowMultiple=true,就可以像这样(多行)用在类上或者方法上了。
*/
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = true)]
//特性类要继承自Attribute类(为什么?),.net约定特性类要以Attribute做结尾
public class RecordAttribute : Attribute
{
//开发者
public string Name { get; set; }
//备注
public string Memo { get; set; }
//日期
public DateTime Date { get; set; }
//定义构造,RecordAttribute就是一个名符其实的类,因为其继承了Attribute,并且在其前面设定了特定,所以自己也就可以做为特性来用了。
public RecordAttribute(string name, string memo, string date)
{
this.Name = name;
this.Memo = memo;
this.Date =Convert.ToDateTime(date);
}
}
}
然后是如何用该特性:
#region 反射 特性
//用于测试自定义的特性(Attribute)类
AttributeTest att = new AttributeTest();
//type类是实现反射的关键
Type t = att.GetType();
//利用反射获取AttributeTest类的特性,并打印
object[] os = t.GetCustomAttributes(typeof(RecordAttribute), false);
Console.WriteLine("AttributeTest的特性信息:");
foreach (RecordAttribute item in os)
{
Console.WriteLine("操作员:" + item.Name + "," + "备注:" + item.Memo + "," + "日期:" + item.Date);
}
Console.WriteLine("AttributeTest的特性信息结束");
Console.WriteLine("AttributeTest的aa方法的特性信息:");
MethodInfo method = t.GetMethod("aa");
object[] mAtt = method.GetCustomAttributes(typeof(RecordAttribute), false);
foreach (RecordAttribute item in mAtt)
{
Console.WriteLine("操作员:" + item.Name + "," + "备注:" + item.Memo + "," + "日期:" + item.Date);
}
Console.WriteLine("AttributeTest的aa方法的特性结束");
#endregion
新建控制台程序,在program中引用AttributeTest,在main中拷贝该代码就可以直接运行。
用反射来获取类或者方法的特性的方式,能让我们更方便地获取代码的变更历史,相比较于用注释的方式,确实好多了。
asp.net 自定义特性的更多相关文章
- Asp.net core通过自定义特性实现双端数据验证的一些想法
asp.net core集成了非常方便的数据绑定和数据校验机制,配合操作各种easy的vs,效率直接高到飞起. 通过自定义验证特性(Custom Validation Attribute)可以实现对于 ...
- Asp.net MVC通过自定义特性实现Action日志记录
一.自定义特性 /// <summary> /// 描述特性 /// </summary> [AttributeUsage(AttributeTargets.Method)] ...
- Attribute自定义特性+Asp.net MVC中的filter详解
转载自:http://blog.csdn.net/wangyy130/article/details/44241957 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC ...
- asp.net—自定义轻量级ORM
大型项目中ORM的使用已经是相当的频繁.目前.NET(C#)中比较流行的ORM框架也有很多,比如SqlSugar,Dapper,Entity Framework(EF)等. 相信很多有2年以上工作经验 ...
- 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式
连表查询都用Left Join吧 最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...
- C#反射与特性(七):自定义特性以及应用
目录 1,属性字段的赋值和读值 2,自定义特性和特性查找 2.1 特性规范和自定义特性 2.2 检索特性 3,设计一个数据验证工具 3.1 定义抽象验证特性类 3.2 实现多个自定义验证特性 3.3 ...
- 【.net 深呼吸】自定义特性(Attribute)的实现与检索方法
在.net的各个语言中,尤其是VB.NET和C#,都有特性这一东东,具体的概念,大家可以网上查,这里老周说一个非标准的概念——特性者,就是对象的附加数据.对象自然可以是类型.类型成员,以及程序集. 说 ...
- Visual Studio 2015速递(3)——ASP.NET 新特性
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- C#自定义特性实例
元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1.什么是特性 (1)属性与特性的区别 属性(Property):属性是面向对象思想里所说的封装在类里面的数据字段, ...
随机推荐
- python基础语法18 类的内置方法(魔法方法),单例模式
类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...
- 1.Java介绍
第一章 走进Java 一.Java技术体系 Java技术体系组成部分:Java程序设计语言.Java虚拟机.Class文件格式.Java API类库 JDK:Java程序设计语言 + Java虚拟机 ...
- 解决 IDEA 创建 Gradle 项目没有src目录问题
解决 IDEA 创建 Gradle 项目没有src目录问题 前几天遇到一个问题,就是使用IDEA创建gradle项目后,src目录没有自动生成出来,今天就给大家分享一下怎么解决. 1. 目录:创建的 ...
- How to convert a std::string to const char* or char*?
How to convert a std::string to const char* or char*? 1. If you just want to pass a std::string to a ...
- 计算GPS点之间的距离
latitude纬度 longtitude经度 // 求弧度 double getRadian(double d) { return d * PI / 180.0; //角度1? = π / 180 ...
- USB、UART、SPI等总线速率(转)
1. USB总线 USB1.1: ——-低速模式(low speed):1.5Mbps ——-全速模式(full speed): 12Mbps USB2.0:向下兼容.增加了高速模式,最大速率480M ...
- [原创]Android Monkey 在线日志分析工具开发
[原创]Android Monkey 在线日志分析工具开发 在移动App测试过程中,Monkey测试是我们发现潜在问题的一种非常有效手段,但是Android原生的Monkey有其天然的不足,数据不能有 ...
- this与bind(this) (es5新增)
this与bind(this) this this指向的是当前函数的作用域(对象实例),有如下的例子 const app = { name: 'xiaoming', log() { console.l ...
- Win10开启上帝模式
1.新建一个文件夹2.修改文件夹名字为 上帝模式.{ED7BA470-8E54-465E-825C-99712043E01C}
- 【C语言学习笔记】指针
用来存放一个变量地址的变量就叫指针变量.指针变量也是有类型约束的,一般什么类型的指针指向什么类型的变量. 指针之所以叫变量,是因为它里面所存放的变量的地址也是不断变化的,指针是可以移动的. 定义格式: ...