• 学习笔记--C#特性Attribute(一)


    这个框框好烦人啊,删不掉

    一、背景

    [serializable]
    public class Person(){}

    这是我第一次看到特性(Attribute),那时我还不知道这是什么,怎么会有这种写法,让我纠结了很久,我只知道,加了这个后,这个类就可以序列化了。

    二、使用

    定义自己的Attribute

    //自定义特性,跟普通的类差不多,继承Attribute,
    //这个类中有2个构造函数,和一个属性
    public class MyClassAttribute:Attribute
    {
        public MyClassAttribute(){}
        public MyClassAttribute(string text)
        {
             MyProperties=text;
             Console.WriteLine("你输入的参数为:"+text);
        }
        public string MyProperties{get;set;}
    }
    
    //这里定义了两个特性,用与后面测试
    public class MyMethodAttribute:Attribute
    {
        public MyMethodAttribute(){}
        public MyMethodAttribute(string text)
        {
             MyProperties=text;
             Console.WriteLine("你输入的参数为:"+text);
        }
        public string MyProperties{get;set;}
    }

    ②如何使用特性:

    //特性使用很简单,就是在想使用的地方用一个个中括号引用就可以了
    [TestClassAttribute("特性使用在类上")]
    public class Test
    {
            [TestMethodAttribute("特性使用在方法上")]
            public void TestAccess()
         {
          Console.WriteLine("这是一个测试方法");
         } }

    ③测试

    class Program
    {
         static void Main(string[] args)
        {
             Test testData=new Test();
             TestData.TestAccess();
        }
    } 

    输出结果:
    这是一个测试方法

    结论:
    附加
    特性的类或方法,在运行时不会受特性影响(如果该特性没做什么事)
    它只是在类或方法上多加了一段提示信息,类似于一段注释代码,不过用IL反汇编程序(开始菜单中搜索IL),可以看出,特性被编译到dll中,而注释是没有这个待遇的

    ④获取特性的值

    public class GetValueFromMyAttribute
    {
        public static void Run() 
        {
            bool isDefinedMethodAttribute = Attribute.IsDefined(typeof(Test).GetMethod("TestAccess"), typeof(MyMethodAttribute));
            bool isDefinedClassAttribute = Attribute.IsDefined(typeof(Test), typeof(MyClassAttribute));
    
            if (isDefinedMethodAttribute)
            {
              MyMethodAttribute attr = Attribute.GetCustomAttribute(typeof(Test).GetMethod("TestAccess"), typeof(MyMethodAttribute)) as MyMethodAttribute;
    
              Console.WriteLine(attr.MyProperties); 
         }

         if (isDefinedClassAttribute)
         {
          TestClassAttribute attr
    = Attribute.GetCustomAttribute(typeof(Test), typeof(MyClassAttribute)) as MyClassAttribute;

          Console.WriteLine(attr.
    MyProperties);
         }
      }
    }

    ⑤测试

    class Program
    {
         static void Main(string[] args)
        {
             Test testData=new Test();
             TestData.TestAccess();
         GetValueFromMyAttribute.Run();
      }
    }

    输出结果:
    这是一个测试方法
    你输入的参数为:
    特性使用在方法上(构造函数)
    特性使用在方法上(获取到的值)
    你输入的参数为:特性使用在类上
    特性使用在类上

    三、系统中常用的Attribute

    除了一开始出现Serializable、后来还遇到过HttpPost、HttpGet、AjaxPro.AjaxMethod()等等

    DllImport:导入第三方dll

    class InCommonUse
    {
    [DllImport("User32.dll")]
    public static extern in MessageBox(int hParent,string message,string caption,int type);
    
    public static void Test()
    {
     MessageBox(0,"外部导入了User32.dll文件","提示",0)
     Console.Readkey();
    }
    }

    Conditional:指定模式下运行

    [Conditional("DEBUG")]
    private
    static void TestConditional() {
      Console.WriteLine("只在debug模式下运行");
    }

    Obsolete:过时提示

    这个估计大部分人都遇到过

    这次就写到这里了,等待后续学习

    四、总结


    文章总得有个结尾,前几天考四级,学到了一句,

    According what has been discussed above, this is a good thing, hereby, write a blog to record this important moment

  • 相关阅读:
    九大排序算法
    iOS开发之自定义输入框(利用UITextField及UITextView)
    SQL Server调优系列进阶篇(查询语句运行几个指标值监测)
    C#资源文件与与资源名称字符串之间的互相转化
    EF中用Newtonsoft.Json引发的循环引用问题
    Ajax应用常见的HTTP ContentType设置
    jQuery验证控件jquery.validate.js使用说明+中文API
    今天发现了个轻量级的微信开发的东西。。 记录下
    ASP.NET多文件批量打包下载
    TransactionScope的使用
  • 原文地址:https://www.cnblogs.com/Ruan/p/3482821.html
Copyright © 2020-2023  润新知