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);
            }
        }
    }
    

    得到的运行结果如下图:

  • 相关阅读:
    Java--动态代理
    java-finalize
    Oauth1.0认证过程
    深入理解-HashMap
    Java--对象内存布局
    Java--finally
    一个非常有用的算法---统计二进制数中1的个数
    进程之间通信
    SpringMVC听课笔记(十三:使用拦截器)
    SpringMVC听课笔记(十二:文件的上传)
  • 原文地址:https://www.cnblogs.com/cnliu/p/1673384.html
Copyright © 2011-2022 走看看