Attribute (一)

本文导读

1、概念

2、自定义一个 Attribute


概念

      Attribute是一个特殊的类,我们知道 .NET 程序集 具有自描述的特性(由于元数据),Attribute和.NET的元数据一起,可用来向描述你的代码,或者在程序运行的时候影响应用程序的行为。

      和Attribute 密切相关的技术是反射

      在.NET 框架中有许多内置的 Attribute,如序列化、安全性、DllImport等

      看一个内置Attribute 的代码

using System;

static class App
{
    static void Main()
    {
        Lib l = new Lib();
        l.Fct();
    }
}

class Lib
{
    [Obsolete]
    public void Fct(){}
}

结果

 

自定义一个 Attribute

     系统的Attribute我们不能修改,我们能做的是自定义Attribute。步骤如下:

1、写一个继承 System.Attribute 的类,类名是以 Attribute 结尾

2、用系统自带的AttributeUsage 设置 Attribute

AttributeUsage 中有三个成员我们需要关注 AttributeTargets、AllowMultiple 、Inherited  分别的表示 Attribute 的作用范围、是否允许多个 Attribute实例(Attribute是类,反射时创建实例)、是否允许继承

 

我们看例子

Inherited  的例子

目录结构

是否允许继承文件夹中有4个文件分别是 Attr.cs(自定义Attribute)、TestLib.cs(Attribute修饰的测试类)、App.cs(第三方验证程序,比如框架)、build.bat 编译命令

看代码

//Attr.cs
using System;

namespace XXX.Common.Attr
{
    // 不允许属性继承
    [AttributeUsage(AttributeTargets.Class,Inherited = false)]
    public class AAttribute : Attribute {}

    // 允许属性继承
    [AttributeUsage(AttributeTargets.Class,Inherited = true)]
    public class BAttribute : Attribute {}
}

//---------------------------------------------------------
// TestLib.cs
using System;
using XXX.Common.Attr;

namespace XXX.Common.Lib
{
    [A]
    [B]
    public class BaseLib {}

    public class ExtendLib : BaseLib {}
}

//---------------------------------------------------------
// App.cs
using System;
using XXX.Common.Attr;
using XXX.Common.Lib;
using System.Reflection;

namespace XXX.Common.App
{
    static class App
    {
        static void Main()
        {
            ShowBase();
            Console.WriteLine("-----------------");
            ShowExtend();
        }

        static void ShowBase()
        {
            ShowHelper(typeof(BaseLib));
        }

        static void ShowExtend()
        {
            ShowHelper(typeof(ExtendLib));
        }

        static void ShowHelper(MemberInfo mi)
        {
            AAttribute a = Attribute.GetCustomAttribute(mi,typeof(AAttribute)) as AAttribute;
            BAttribute b = Attribute.GetCustomAttribute(mi,typeof(BAttribute)) as BAttribute;

            Console.WriteLine(a==null ? "没有AAttribute信息" : "有AAttribute信息");
            Console.WriteLine(b==null ? "没有BAttribute信息" : "有BAttribute信息");
        }
    }
}

build.bat 内容

csc /t:library Attr.cs
csc /t:library /r:Attr.dll TestLib.cs
csc /r:Attr.dll,TestLib.dll App.cs

运行结果:

 

AllowMultiple 允许重复 Attribute

看代码

// Attr.cs
using System;

namespace XXX.Common.Attr
{
    // 默认AllowMultiple 为false
    [AttributeUsage(AttributeTargets.Class)]
    public class AAttribute : Attribute {}

    [AttributeUsage(AttributeTargets.Class,AllowMultiple=true)]
    public class BAttribute : Attribute {}
}

//-----------------------------------
// TestLib.cs
using System;
using XXX.Common.Attr;

namespace XXX.Common.Lib
{
    [A]
    [A]
    public class Lib1{}

    [B]
    [B]
    public class Lib2{}
}

 

 

综合例子

//Attr.cs
using System;

namespace XXX.Common.Attr
{
    [AttributeUsage(AttributeTargets.All)]
    public class HelperAttribute : Attribute
    {
        private string _url;
        private string _topic;

        public HelperAttribute(string url)
        {
            this._url = url;
        }

        public string Url
        {
            get {return this._url;}
        }
        public string Topic
        {
            get {return this._topic;}
            set {this._topic = value;}
        }
    }
}

//---------------------------------------
// TestLib.cs
using System;
using XXX.Common.Attr;

namespace XXX.Common.Lib
{
    [Helper("http://cnblogs.com/Aphasia")]
    public class TestLib
    {
        [Helper("http://cnblogs.com/Aphasia",Topic="阿飞的博客")]
        public void ShowBlog(){}
    }
}

//-----------------------------------------
// App.cs
using System;
using System.Reflection;
using XXX.Common.Lib;
using XXX.Common.Attr;

namespace XXX.Common.Application
{
    static class App
    {
        static void Main()
        {
            ShowHelp(typeof(TestLib));
            ShowHelp(typeof(TestLib).GetMethod("ShowBlog"));
        }

        static void ShowHelp(MemberInfo mi)
        {
            HelperAttribute attr = Attribute.GetCustomAttribute(mi,typeof(HelperAttribute)) as HelperAttribute;

            if(attr == null) {Console.WriteLine("No Help for {0}.",mi);}
            else
            {
                Console.WriteLine("Help for {0}:",mi);
                Console.WriteLine(" Url={0},Topic={1}",attr.Url,attr.Topic);
            }
        }
    }
}

运行结果

 

 

第二篇预告

Attribute (二) 将谈Attribute在设计中的用途,拦截器、Builder 模式

本文完

时间: 2024-10-05 11:41:05

Attribute (一)的相关文章

AttributeError: 'module' object has no attribute 'dumps'

报错: [[email protected] ~]# ./json.py DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}] Traceback (most recent call last): File "./json.py", line 4, in <module> import json File "/root/json.py", line 8, in <module> data_string = jso

Django admin 中抛出 &#39;WSGIRequest&#39; object has no attribute &#39;user&#39;的错误

这是Django版本的问题,1.9之前,中间件的key为MIDDLEWARE_CLASSES, 1.9之后,为MIDDLEWARE.所以在开发环境和其他环境的版本不一致时,要特别小心,会有坑. 将settings里的MIDDLEWARE_CLASSES默认配置顺序改成如下 MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.middleware.common.CommonMiddlewar

JavaScript中的property和attribute的区别

时间: 2013-09-06 | 10:24 作者: 玉面小飞鱼 分类: DOM, js相关, 前端技术 2,222 次浏览 1. 定义 Property:属性,所有的HTML元素都由HTMLElement类型表示,HTMLElement类型直接继承自Element并添加了一些属性,添加的这些属性分别对应于每个HTML元素都有下面的这5个标准特性: id,title,lang,dir,className.DOM节点是一个对象,因此,他可以和其他的JavaScript对象一样添加自定义的属性以及方

module has no attribute &#39;seq2seq&#39;

tensorflow 中tf.nn.seq2seq.sequence_loss_by_example to tf.contrib.legacy_seq2seq.sequence_loss_by_example tf.nn.rnn_cell. to tf.contrib.rnn. 1.0修改了很多地方,错误可取官网搜索. module has no attribute 'seq2seq'

CVS导出&amp;&amp;自定义Attribute的使用

1.cvs导出:List转为byte[] /// <summary> /// CvsExport帮助类 /// </summary> public static class CvsExportHelper { /// <summary> /// Creates the CSV from a generic list. /// </summary>; /// <typeparam name="T"></typeparam&

javascript中attribute和property的区别详解

DOM元素的attribute和property很容易混倄在一起,分不清楚,两者是不同的东西,但是两者又联系紧密.很多新手朋友,也包括以前的我,经常会搞不清楚. attribute翻译成中文术语为"特性",property翻译成中文术语为"属性",从中文的字面意思来看,确实是有点区别了,先来说说attribute. attribute是一个特性节点,每个DOM元素都有一个对应的attributes属性来存放所有的attribute节点,attributes是一个类数

Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

最近在编写Python脚本过程中遇到一个问题比较奇怪:Python脚本完全正常没问题,但执行总报错"AttributeError: 'module' object has no attribute 'xxx'".这其实是.pyc文件存在问题. 问题定位: 查看import库的源文件,发现源文件存在且没有错误,同时存在源文件的.pyc文件 问题解决方法: 1. 命名py脚本时,不要与python预留字,模块名等相同 2. 删除该库的.pyc文件(因为py脚本每次运行时均会生成.pyc文件

C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

反射以及Attribute在ORM中的应用 一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行是获取对象的信息,还提供运行时动态调用对象方法以及动态设置.获取属性等的能力.反射在ORM中有什么用呢?我这里所讨论的ORM实现是通过自定义Attribute的方式进行映射规则的描述的.但是我们并不知道具体哪个对象需要对应哪个表,并且这些对象是独立于我们的ORM框架的,所以我们只能通过自定义Attr

AttributeError: &#39;dict_values&#39; object has no attribute &#39;translate&#39;

/***************************************************************************************** * AttributeError: 'dict_values' object has no attribute 'translate' * 说明: * 由于目前使用的是Python3,在解读MySQL的ORM库的时候,结果直接遇到这个错误. * * 2016-10-13 深圳 南山平山村 曾剑锋 **********

ecshop 属性表(attribute)商品属性表(goods_attr)货品表(prduct) 商品数量的联系

一个商城的商品属性存放在属性表(attribute)里 ,每个商品对应的属性在goods_attr里 goods_attr与(attribute)想关联,商品表里有商品数量的字段goods_number为什么有这个货品表呢? 因为 某件商品有多种属性的时候,那这个商品就成为了货品,也就是说不同属性的相同商品应该也存在差异,所以当设置商品属性的attr_type=1(表示单选属性)的时候,在 前台include/lib_comment.php 函数sort_goods_attr_id_array将