c# Attribute 怎么用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# Attribute 怎么用相关的知识,希望对你有一定的参考价值。
//自定义了一个Attribute
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
class IStudentAttribute : Attribute
public string Name get; set;
public int Age get; set;
//下面是调用
[IStudent(Name = "abc", Age = 20)]
public void F()
//请问,Name 和 Age的值能取到吗?我没看到有什么用啊?
public class MyClass
[IStudent(Name = "abc", Age = 20)]
public void F()
那么可以这么去取值:
Type type = typeof(MyClass);
MethodInfo methodInfo = type.GetMethod("F");
if (methodInfo.IsDefined(typeof(IStudentAttribute), false))
object[] attributes = methodInfo.GetCustomAttributes(typeof(IStudentAttribute), false);
IStudentAttribute studentAttr = (IStudentAttribute)attributes[0];
Console.WriteLine(studentAttr.Name + studentAttr.Age);
实际上,Attribute可以有很多用处,比如说,你可以在某个方法上做标记看有没有权限调用,或者在某个属性上标记,看要如何校验。例如(实在习惯用var关键字了,下面的代码都用var了,还有Linq):
假设我们有这么一个标记来说明操作的权限:
/// <summary>
/// 声明权限的标记
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class PermissonAttribute : Attribute
public string Role get; set;
public PermissonAttribute(string role)
this.Role = role;
public PermissonAttribute()
有一个操作类应用了该标记:
/// <summary>
/// 文件操作类
/// </summary>
public class FileOperations
/// <summary>
/// 任何人都可以调用Read
/// </summary>
[Permisson("Anyone")]
public void Read()
/// <summary>
/// 只有文件所有者才能Write
/// </summary>
[Permisson("Owner")]
public void Write()
然后我们写一个工具类来检查操作权限
/// <summary>
/// 调用操作的工具类
/// </summary>
public static class OperationInvoker
public static void Invoke(object target, string role, string operationName, object[] parameters)
var targetType = target.GetType();
var methodInfo = targetType.GetMethod(operationName);
if (methodInfo.IsDefined(typeof(PermissonAttribute), false))
// 读取出所有权限相关的标记
var permissons = methodInfo
.GetCustomAttributes(typeof(PermissonAttribute), false)
.OfType<PermissonAttribute>();
// 如果其中有满足的权限
if (permissons.Any(p => p.Role == role))
methodInfo.Invoke(target, parameters);
else
throw new Exception(string.Format("角色0没有访问操作1的权限!", role, operationName));
最后,在使用的时候:
var role = "Anyone";
var opertion = new FileOperations();
// 可以正常调用Read
OperationInvoker.Invoke(operation, "Read", null);
// 但是不能调用Write
OperationInvoker.Invoke(operation, "Write", null); 参考技术A 首先,创建一个自定义的Attribute,并且事先设定我们的Attribute将施加在class的元素上面以获取一个类代码的检查信息。
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.Class)]
public class CodeReviewAttribute : System.Attribute //定义一个CodeReview的Attribute
private string reviewer; //代码检查人
private string date; //检查日期
private string comment; //检查结果信息
//参数构造器
public CodeReviewAttribute(string reviewer, string date)
this.reviewer=reviewer;
this.date=date;
public string Reviewer
get
return reviewer;
public string Date
get
return date;
public string Comment
get
return comment;
set
comment=value;
自定义CodeReviewAttribute同普通的类没有区别,它从Attribute派生,同时通过AttributeUsage表示我们的Attribute仅可以施加到类元素上。
第二步就是使用我们的CodeReviewAttribute, 假如有一个Jack写的类MyClass,检查人Niwalker,检查日期2003年7月9日,于是我们施加Attribute如下:
[CodeReview("Niwalker","2003-7-9",Comment="Jack的代码")]
public class MyClass
//类的成员定义
当这段代码被编译的时候,编译器会调用CodeReviewAttribute的构造器并且把"Niwalker"和"2003-7-9"分别作为构造器的参数。注意到参数表中还有一个Comment属性的赋值,这是Attribute特有的方式,这里可以设置更多的Attribute的公共属性(如果有的话),需要指出的是.NET Framework1.0允许向private的属性赋值
但在.NET Framework1.1已经不允许这样做,只能向public的属性赋值。
第三步就是取出需要的信息,这是通过.NET的反射来实现的:
class test
static void Main(string[] args)
System.Reflection.MemberInfo info=typeof(MyClass); //通过反射得到MyClass类的信息
//得到施加在MyClass类上的定制Attribute
CodeReviewAttribute att=
(CodeReviewAttribute)Attribute.GetCustomAttribute(info,typeof(CodeReviewAttribute));
if(att!=null)
Console.WriteLine("代码检查人:0",att.Reviewer);
Console.WriteLine("检查时间:0",att.Date);
Console.WriteLine("注释:0",att.Comment);
在上面这个例子中,Attribute扮演着向一个类添加额外信息的角色,它并不影响MyClass类的行为。
通过这个例子,可以知道如何写一个自定义的Attribute,以及如何在应用程序使用它. 参考技术B 这个东西..叫特性..当然有些地方也翻译成属性..
但是此属性非彼属性...
在英文中这个叫Attribute,那个叫Property.
Attribute相当于给类或其他定义添加编译时属性.
public void F()
这里面取值 和Attribute有什么关系???
参考技术C 博客园里面作者搜索liulun我同事写过一篇特性的文章
以上是关于c# Attribute 怎么用的主要内容,如果未能解决你的问题,请参考以下文章
c#操作xml时我想获得某个节点的attribute[1]到最后的每个属性的值。attribute[0]不要
C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)