定制Attribute

目录

  • Attribute是什么
  • 自定义Attribute

一、Attribute是什么

将一些附加信息与制定目标相关联的方式。编译器在元数据中生成这些额外的信息。也叫做特性。

比如之前文章中提到的:枚举类型与位运算。也是向枚举类型定制了[FlagsAtribute]特性,将枚举类型作为一个位标识集合使用。

 [Flags]
public enum Options
{
            None=0,
            Insert = 1, //二进制: 0001
            Update = 2, //二进制: 0010
            Save = 4,   //二进制: 0100
            Delete = 8, //二进制: 1000
            Query = 16  //二进制:10000
}

Attribute使用[]进行标记说明,会在某个目标元素的上方,这里的Flags是FlagsAttribute的简写。

1、那我们F12看一下[Falags]的定义:

public class FlagsAttribute : Attribute
{
        // 摘要:
        //     初始化 System.FlagsAttribute 类的新实例。
        public FlagsAttribute();
}

FlagsAttribute直接或者间接继承自Attribute。当然我们也可以看出所说的Flags特性就是一个类的实例。既然是类的实例,需要有构造方法,所以我们也就看到了上面的构造函数FlagsAttribute。

我们写的[Falags]实际是调用了public FlagsAttribute();构造函数。

2、那我们再来一个例子,先不管这句话什么意思,或者作用是什么。

[DllImport("Json.Text", CharSet = CharSet.Auto,BestFitMapping=true)]
 public void GetNewMail(string from, string to, string msg)
{
     MailInfo newmailinfo = new MailInfo(from, to, msg);
            OnNewMail(newmailinfo);

}

我们同样F12看一下定义:

public sealed class DllImportAttribute : Attribute
{
        public bool BestFitMapping;

        public CharSet CharSet;

        public DllImportAttribute(string dllName);

        public CallingConvention CallingConvention;
        public string EntryPoint;
        public bool ExactSpelling;
        public bool PreserveSig;
        public bool SetLastError;
        public bool ThrowOnUnmappableChar;
        public string Value { get; }
}

但是这里的构造函数是接受一个String类型的参数,但是我们调用时却是这样写

[DllImport("Json.Text", CharSet = CharSet.Auto,BestFitMapping=true)]

这里的第一个参数是狗咱好书默认的参数,而后面的是DllImportAttribute类中的公共属性或者公共字段,那就不难理解我们这里直接调用了里面的两个公共属性并给他们做了赋值。

那就不难理解这些为什么会这样写了:

 [Table("Menu", Schema = "admin")]

3、多个Attribute组合

 [Flags]
[DllImport("Json.Text", CharSet = CharSet.Auto, BestFitMapping = true)]
public enum Options
{
            None=0,
            Insert = 1, //二进制: 0001
            Update = 2, //二进制: 0010
            Save = 4,   //二进制: 0100
            Delete = 8, //二进制: 1000
            Query = 16  //二进制:10000
}

我们也可以这样写,两个特性用,分隔:

 [Flags, DllImport("Json.Text", CharSet = CharSet.Auto, BestFitMapping = true)]

二、自定义Attribute

如何根据需求定义我们自己的特性,通过以上的了解,我们至少知道我们的Attribute直接或者间接继承基类Attribute,并且要有实例构造函数进行构造。也可以定义一些需要的公共属性等等。

当然命名也要符合约定以Attribute为后缀。

 [System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct,
                                AllowMultiple = true,
                                Inherited = true
                                )]
public class MarkAttribute : System.Attribute
{
            public string appname;
            public double version = 1.0;

            public MarkAttribute(string appname)
            {
                this.appname = appname;
            }
}

我们定义一个MarkAttribute,我们约定我们自定义的特性符合AttributeUsage特性:目标元素为类或者结构,允许多个属性,可以继承。

我们自己定义的MarkAttribute,有两个公共字段appname和version。并有一个构造函数。

这样我们这样运用自己的简单的特性:

 [Mark("Apple", version = 2.0)]
    public class APP
    {
    }

既然定义了,也标注到了特定的目标上,剩下的就是我们调用了。

通过反射来调用我们定义的特性:

 System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(MarkAttribute));  // Reflection.

            foreach (System.Attribute attr in attrs)
            {
                if (attr is MarkAttribute)
                {
                    MarkAttribute m = (MarkAttribute)attr;
                    System.Console.WriteLine("   {0}, 版本 {1:f}",m.appname,m.version);
                }
            }

这样我们就完成了我们自定义的特性并完成调用。

但是编译器是如何调用Attribute的呢?

编译器检测到一个元素应用到一个元素应用到attribute的时候,编译器会调用attribute类的构造器,向他传递参数,就构造了一个实例,

编译器再根据特定的语法对公共字段和属性进行初始化,并将这些信息驻留到元数据中。这只是会生成相关的元数据。

那编译器又是如何调用特性的呢?

和我们上面的例子类似,通过反射。我们知道所有的特性都继承自Attribute,我们F12转到定义可以看到,基类Attribute主要有三组方法组成:

GetCustomAttribute:返回应用的一个特性.

GetCustomAttributes:返回应用的多个特性.

IsDefined:检测判断元素是否应用Attribute.

总结,我们知道什么是Attribute,并可以自定义Attribute.

时间: 2024-12-30 00:56:45

定制Attribute的相关文章

C# 特性(Attribute)详细介绍

1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为. 在.NET中,Attribute被用来处理多种问题,比如序列化.程序的安全特征.防止即时编译器对程序代

读书笔记—CLR via C#委托和attribute

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 委托 类型安全的回调函数,函数签名定义声明.指向静态或实例方法 派生自System.MulticastDelegate的类 将方法绑定到委托时,C#和CLR都允许引用类型的协变性和逆变性 协变性指方法能返回从委托的返回类型派生的类型 逆变性是指

做自己的ORMapping Framework ---- 第三讲 关于Attribute

在这个ORMapping的系列博文里,这个框架的实现会基于这个Attribute的使用.下面还是弄点东西,让小伙伴对Attribute这个东西有一个比较好的认识,我自己也就不写了,找一个写得还可以整理下的给大家了解下. 1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NE

(转)Attribute在.net编程中的应用

Attribute在.net编程中的应用(一)Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是一个非常重要的组成部分,为了帮助大家理解和掌握Attribute,以及它的使用方法,特地收集了几个Attribute使用的例子,提供给大家参考. 在具体的演示之前,我想先大致介绍一下Attribute.我们知道在类的成员中有property成员,二者在中文中都做属性解释,那么它们到底是不是同一个东西呢

[转]Attribute在.net编程中的应用

Attribute在.net编程中的应用(一) Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是一个非常重要的组成部分,为了帮助大家理解和掌握Attribute,以及它的使用方法,特地收集了几个Attribute使用的例子,提供给大家参考. 在具体的演示之前,我想先大致介绍一下Attribute.我们知道在类的成员中有property成员,二者在中文中都做属性解释,那么它们到底是不是同一个东西

有关C#标签Attribute的熟悉

Attribute 简单用法: 最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [AttributeUsage(AttributeTargets.Class)] public class VersionAttribute : Attribute { public string Name { get; set; } public string Date { get

.Net Attribute特性

1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为. 在.NET中,Attribute被用来处理多种问题,比如序列化.程序的安全特征.防止即时编译器对程序代

(转)C# 特性(Attribute)详细介绍

本文转载自:http://www.cnblogs.com/luckdv/articles/1682488.html 1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用

C#attribute-----------初级

前言: attribute是 .net FrameWork 提出的技术,可以为自己的代码添加注解,从而实现些特殊功能. 一. attribute功能 attribute被译作特性,既然是特性,必然功能不一般. 1.微软的说法 MSDN给出的attribute功能:Attribute类将预定义的系统信息或用户定义的自定义信息与目标元素相关联. 预定义的系统的信息也就是.net给出的系统attribute,用户自定义的信息也就是用户定义的attribute.目标元素呢就是指元数据的元素TypeDef