• .Net之美读书笔记15


    .Net反射

    .Net 反射为:程序运行时,获取类型的元数据(对类型信息的描述)。这里对反射的应用小节一下。

    反射的入口(Type)

    Type为处理反射元数据的类。获取Type的途径。

    • Type ty = Type.GetType("System.Int32");
    • Type type = swim.GetType();
    • typeof(int);

    获取类型的基本信息

    获取类型相关的信息:类型名、类型全名、基类名以及对类型的一些判断IsXXX

        Type type = typeof(int);
        Console.WriteLine(type.Name);
        Console.WriteLine(type.FullName);
        Console.WriteLine(type.BaseType.Name);
        Console.WriteLine(type.IsInterface);
        Console.WriteLine(type.IsClass);
    

    获取类型的成员

    MemberInfo 包括属性、字段、函数、事件等

            MemberInfo[] memberInfo = type.GetMembers();
            foreach (MemberInfo mi in memberInfo)
            {
                Console.WriteLine(mi.Name);
            }
    
            Console.WriteLine("********************");
            FieldInfo[] fieldInfo = type.GetFields();
            foreach(FieldInfo fi in fieldInfo)
            {
                Console.WriteLine(fi.Name);
            }
    
            Console.WriteLine("********************");
            PropertyInfo[] propertyInfo = type.GetProperties();
            foreach(PropertyInfo pi in propertyInfo)
            {
                Console.WriteLine(pi.Name);
            }
            Console.WriteLine("********************");
            MethodInfo[] method = type.GetMethods();
            foreach (MethodInfo md in method)
            {
                Console.WriteLine(md.Name);
            }
    

    反射创建实体

    新建类Person

    public class Person
    	{
    		public string ID { get; set; }
    		public string Name { get; set; }
    		public string Gender { get; set; }
    		public DateTime Birthday { get; set; }
    
    		public virtual void Study()
    		{
    			Console.WriteLine("I am a person.I must study!");
    		}
    	}
    
    1. 根据类型动态创建方法1
        Type type = typeof(Person);
        Assembly asm = Assembly.GetExecutingAssembly();
        object obj1 = asm.CreateInstance(type.FullName);
    
    1. 方法二
    object obj2 = Activator.CreateInstance(null, type.FullName).Unwrap();
    
    1. 动态调用方法1
    type.InvokeMember("Study", BindingFlags.InvokeMethod, null, obj1, null);
    
    1. 动态调用方法二
    	MethodInfo mi1 = type.GetMethod("Study");
        mi1.Invoke(obj2,null);
    
    1. 动态修改属性值与取值
    	PropertyInfo pi1 = type.GetProperty("Name");
        pi1.SetValue(obj1, "Hello World!");
        Console.WriteLine(pi1.GetValue(obj1));
    

    程序集的反射

    获取程序集的方式:Assembly asm = Assembly.LoadFrom("Demo.dll").程序集写有模块,通过反射可以得到程序集信息。

    特性(Attribute)

    1. 继承System.Attribute类,要自定义特性类添加Attribute后缀
    2. 获取属性的自定义特性GetCustomAttributes()
  • 相关阅读:
    OpenWrt/LEDE 没有slabtop命令
    OpenWrt/LEDE 没有/proc/slabinfo文件
    泰坦陨落2 origin安装时vc++runtime没有安装成功错误
    OpenWrt/LEDE中使用qt库
    椭圆曲线加密(ECC):域和离散对数
    batman-adv使用中修改一跳惩罚,batctl无法修改hop_penalty
    VMnet8设置ping通外网
    支持自动水平拆分的高性能分布式数据库TDSQL
    cronsun是替换 crontab 一个不错的选择
    MySQL 的 20+ 条最佳实践
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8135416.html
Copyright © 2020-2023  润新知