Unity学习(C#)——反射和特性(Type、Assemly、Conditional、DebuggerStepThrough)

反射和特性(Type类)
每一个类对应一个Type对象,这个type对象储存了这个类 有哪些方法和数据、成员。
1.Type基本功能
获取类名:type.Name
获取命名空间:type.Namespace
获取程序集类:type.Assembly
获取公共字段:type.GetFields()
返回公共属性type.GetProperties()
获取所有的方法:type.GetMethods()

 class Program
    {
        static void Main(string[] args)
        {
            //通过type对象可以获取它对应的类的所有成员(public)
            Class1 myclass = new Class1();//每一个类对应一个Type对象,这个type对象储存了这个类有哪些方法和数据、成员,不包含具体数据
            Type type = myclass.GetType();//通过对象获取类的Type对象
            Console.WriteLine(type.Name);//获取类名
            Console.WriteLine(type.Namespace);//获取命名空间
            Console.WriteLine(type.Assembly);//获取程序集类
            FieldInfo[] array = type.GetFields();//获取字段回当前 Type 的所有公共字段,只能获得public字段
            foreach(FieldInfo info in array)
            {
               Console.Write(info.Name + ' ');
            }

            PropertyInfo[] array2 = type.GetProperties();//返回为当前 Type 的所有公共属性
            foreach (PropertyInfo info in array2)
            {
                Console.Write(info.Name + ' ');
            }

            MethodInfo[] array3 = type.GetMethods();//获取所有的方法
            foreach (MethodInfo info in array3)
            {
                Console.Write(info.Name + ' ');
            }

            Console.ReadKey();



        }

Assemly程序集类

            Class1 myclass=new Class1();
            Assembly assem=myclass.GetType().Assembly;//获取项目程序集
            //Console.WriteLine(assem.FullName);
            Type[] types = assem.GetTypes();
            foreach (var type in types)
            {
                Console.WriteLine(type);
            }

Obsolete表示方法弃用

    class Program
    {
        [Obsolete("这个方法过时了,使用NewMethod代替",true)]//这里的true表示错误,该方法不能用了,会报错
        //[Obsolete]//表示方法已经弃用,但是仍然可以用
        //[Obsolete("这个方法过时了,使用NewMethod代替")]//表示方法已经弃用,但是仍然可以用,会提示
        static void OldMethod()
        {
        
            Console.WriteLine("old");
        }
        static void NewMethod()
{

}
        static void Main(string[] args)
        {
            OldMethod();//波浪线提示表示已经被弃用
            Console.ReadKey();
        }

Conditional特性

//#define IsTest//定义一个宏
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace _706特性
{
    class Program
    {
        [Conditional("IsTest")]//必须要在开头定义一个宏,该函数才能被调用,注释掉之后就不能了
        static void Test1()
        {
            Console.WriteLine("Tste1");
        }
        static void Test2()
        {
            Console.WriteLine("Test2");
        }
        static void Main(string[] args)
        {
            Test1();
            Test2();
            Test1();
            Console.ReadKey();
        }
    }
}

调用者信息特性

        static void PrintOut(string str, [CallerFilePath] string fileName = "", [CallerLineNumber] int lineNumber = 0, [CallerMemberName]string methodName = "")
        {
            Console.WriteLine(str);
            Console.WriteLine(fileName);
            Console.WriteLine(lineNumber);
            Console.WriteLine(methodName);
        }

DebuggerStepThrough特性
知道某些方法不可能出错,跳过这些方向的调试,放在前面

        [DebuggerStepThrough]
        static void Test2()
        {
            Console.WriteLine("Test2");
        }

特性的目标:被特性定义的
特性的消费者:获取和使用了元数据的
创建自定义特性

1.创建类

[AttributeUsage(AttributeTargets.Class)]
    sealed class MyTestAttribute:System.Attribute
    {
        //表示该特性类可以用到的程序结构有哪些
        public int ID { set; get; }
        public string Description { set; get; }
        public string VersionNumber { set; get; }
        public MyTestAttribute(string des)
        {
            this.Description = des;

        }
    }

2.调用


    [MyTest("简单的字符串",ID=100)]//使用特性时,后面的Attribute不用写。通过制定属性的名字,给属性赋值,这种是命名参数。
    class Program
    {
      static void Main(string[] args)
        {
          
            Type type = typeof(Program);
            object[] array = type.GetCustomAttributes(false);
            MyTestAttribute mytest = array[0] as MyTestAttribute;
            Console.WriteLine(mytest.ID);
            Console.ReadKey();
        }
    }

你可能感兴趣的:(Unity学习(C#)——反射和特性(Type、Assemly、Conditional、DebuggerStepThrough))