zoukankan      html  css  js  c++  java
  • 理解自定义特性(Attribute)

    假设 外语老师 是一个类,
    那么 外语老师 应该具有这样的特性:会说外语
    并且 会说外语 这一特性又包含一些信息,比如:外语种类、外语水平、其它信息。

    按照这样的理解,应该有下面的实现。

    using System;
    using System.Reflection;
    
    namespace Test_Console
    {
    
        //自定义一个特性,名为 CanSpeakForeignLanguage ,继承自 System.Attribute
        [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
        public class CanSpeakForeignLanguage : System.Attribute
        {
            private string _languageType;
            private int _languageLevel;
            private string _languageInfo;
    
            //必须定义其构造函数,如果不定义有编译器提供无参默认构造函数 
            public CanSpeakForeignLanguage()
            {
            }
    
            public CanSpeakForeignLanguage(string languageType, int languageLevel)
            {
                _languageType = languageType;
                _languageLevel = languageLevel;
            }
    
            //定义属性 
            //特性和属性不是一回事
            public string LanguageType
            {
                get { return _languageType == null ? string.Empty : _languageType; }
            }
            public int LanguageLevel
            {
                get { return _languageLevel; }
            }
            public string LanguageInfo
            {
                get { return _languageInfo; }
                set { _languageInfo = value; }
            }
    
            //定义方法 
            public void CanSpeak()
            {
                Console.WriteLine("He can speak {0}.", _languageType == null ? "Chinese Only" : _languageType);
            }
        }
    
    
        //定义一个类,LanguageTeacher ,这个类具有 CanSpeakForeignLanguage 特性
        [CanSpeakForeignLanguage("English", 8, LanguageInfo = "This is US English, but not England English.")]
        public class LanguageTeacher
        {
            public void SayHello()
            {
                Console.WriteLine("Hello, I'm a Foreign Language teacher, I can speak Foreign Language.");
            }
        }
    
        //主程序 
        class Program
        {
            static void Main(string[] args)
            {
                Type type = typeof(LanguageTeacher);
                MemberInfo memberinfo = type;
    
                //利用反射获得 LanguageTeacher 所具有的特性信息,赋值给 can
                CanSpeakForeignLanguage can = (CanSpeakForeignLanguage)Attribute.GetCustomAttribute(memberinfo, typeof(CanSpeakForeignLanguage));
    
                //输出 LanguageTeacher 的特性信息
                if (can != null)
                {
                    Console.WriteLine("Class of LanguageTeacher Can Speak: " + can.LanguageType);
                    Console.WriteLine("The English Level of LanguageTeacher is: " + can.LanguageLevel);
                    Console.WriteLine("And, " + can.LanguageInfo);
                }
                Console.WriteLine();
    
                //反射创建 LanguageTeacher 对象,执行它的 SayHello 方法
                object obj = Activator.CreateInstance(type);
                MethodInfo mi = type.GetMethod("SayHello");
                mi.Invoke(obj, null);
            }
        }
    }
    

    得到的运行结果如下图:

  • 相关阅读:
    python random模块
    PAMIE- Python实现IE自动化的模块
    python 教程 第一章、 简介
    python 教程 第三章、 运算符与表达式
    python 教程 第四章、 控制流
    python 教程 第五章、 函数
    python 教程 第六章、 模块
    python 教程 第七章、 数据结构
    职业生涯2
    Nginx 报错: nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) 的解决方法
  • 原文地址:https://www.cnblogs.com/cnliu/p/1673384.html
Copyright © 2011-2022 走看看