前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

.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()
posted @ 2017-12-28 14:09  LoveTomato  阅读(187)  评论(0编辑  收藏  举报