C# 反射学习笔记

class Person {
  private string name;
  public int gender;
  
  public Person() {
    this.name = 'test';
    this.gender = 0;
  }

  public Person(string name, int gender) {
    this.name = name;
    this.gender = gender;
  }

  public void Speak() {
    Console.WriteLine(this.name);
  }
}

// 先获取类的type
Type t = typeof(Person);

// 获取所有公共成员,需要using System.Reflection;
MemberInfo[] members = t.GetMembers();
for (int i = 0; i < members.length; i++) {
  Console.WriteLine(members[i]);
  // 结果是输出所有的公共属性,包括构造函数.ctor,其中name是私有属性,所有不会输出
}

// 获取所有构造函数
ConstructorInfo[] ctors = t.GetConstructors();
for (int i = 0; i < ctors.length; i++) {
  Console.WriteLine(ctors[i]);
  // 结果是输出所有构造函数.ctor
}

// 获取构造函数后调用
// 获取无参构造
ConstructorInfo ctor = t.GetConstructor(new Type[0]);
Person myPerson = ctor.Invoke(null) as Person; // 传null其实就是无参,不传编译不过
Console.WriteLine(myPerson.gender);
// 获取有参构造
ConstructorInfo ctor2 = t.GetConstructor(new Type[] { typeof(string), typeof(int) });
Person myPerson2 = ctor2.Invoke(new object[] { 'Tom', 0 }) as Person;
myPerson2.Speak();

// 获取公共成员变量
FieldInfo[] fields = t.GetFields();
// 获取指定名称的公共成员变量
FieldInfo field = t.GetField('gender');
// 获取某个对象的指定属性值
field.GetValue(myPerson)
// 设置某个对象指定属性的值
field.SetValue(myPerson2, 1)

// 获取公共成员方法
MethodInfo[] methods = t.GetMethods();
// 获取指定名称方法
MethodInfo method = t.GetMethod('Speak');
// 有参数时和上面的构造函数一样的传参方式
method.Invoke();

// Activator快速实例化一个对象
// t为上面的Person type
// 无参构造
Person testP = Activator.CreateInstance(t) as Person;
// 有参构造
Person testP2 = Activator.CreateInstance(t, 'Mary', 1) as Person; 

// Assembly 加载程序集的用法看 https://www.bilibili.com/video/BV1Ar4y1K7AK?spm_id_from=333.788.videopod.episodes&vd_source=52ea87c515c1ffb8283d89287afd8a5d&p=22
// 第41课
posted @ 2025-07-04 08:43  Mizuki-Vone  阅读(15)  评论(0)    收藏  举报