反射
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata.Ecma335;
using System.Runtime;class Test
{private int b;public int a = 1;public string str = "123";public Test() { b = 5; }public Test(int b){this.b = b;}public Test(int a, string str){this.a = a;this.str = str;}public void Speak(int a){Console.WriteLine("{0}说话了",a);}
}class Program
{public static void Main(){Type type = typeof(Test);Console.WriteLine(type.Assembly);//获取类中的所有公共成员MemberInfo[] info = type.GetMembers();for (int i = 0; i < info.Length; i++){Console.WriteLine(info[i]);}Console.WriteLine("00000000000000000");//获取所有公共构造函数ConstructorInfo[] ctor = type.GetConstructors();for (int i = 0; i < ctor.Length; i++){Console.WriteLine(ctor[i]);}Console.WriteLine("111111111111111111");//得到无参构造并执行ConstructorInfo ctorinfo1 =type.GetConstructor(new Type[0]);Test a = ctorinfo1.Invoke(null)as Test;Console.WriteLine(a.str);Console.WriteLine("2222222222222222222");//得到有参构造并执行ConstructorInfo ctorinfo2 =type.GetConstructor(new Type[] {typeof(int), typeof(string)});Test b = ctorinfo2.Invoke(new object[] {666,"999"})as Test;Console.WriteLine(b.str);Console.WriteLine("33333333333333333333");//得到所有公共成员变量FieldInfo[] fieldInfos = type.GetFields();for (int i = 0; i < fieldInfos.Length; i++){Console.WriteLine(fieldInfos[i]);}Console.WriteLine("444444444444444444444");//得到指定名称成员变量FieldInfo info1 = type.GetField("str");Console.WriteLine(info1);Console.WriteLine("555555555555555555555");//通过反射获取和修改对象的值Test test = new Test(12,"693");Console.WriteLine(info1.GetValue(test));Console.WriteLine("6666666666666666666666");//设置info1.SetValue(test, "100");Console.WriteLine(info1.GetValue(test));Console.WriteLine("7777777777777777777777");//获取类的公共成员方法MethodInfo[] MInfos = type.GetMethods();for (int i = 0; i < MInfos.Length; i++){Console.WriteLine(MInfos[i]);}// 调用类中的方法 (让他说话真tm难)//MethodInfo 的Invoke 方法 第一个参数是要调用方法的类,第二个参数是方法要用的参数们MethodInfo speak = type.GetMethod("Speak",new Type[] {typeof(int)});ConstructorInfo constructorInfo =type.GetConstructor(new Type[0] );speak.Invoke((constructorInfo.Invoke(null) as Test),new object[]{ 911});//Activator}
}
反射特性
类库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;namespace ClassLibrary1
{class PlayerAttribute : Attribute{public PlayerAttribute() {}}internal class Player{[Player()] public string Name;public int Atk;public int Hp ;public int Def ;public int posX;public int posY;public Player() { }}
}
特性
using System.Reflection;class Program
{public static void Main(){Assembly a = Assembly.LoadFrom(@"E:\应用 。。。\Visual Studio 2022\WWWWorks\Advanced\ClassLibrary1\bin\Debug\ClassLibrary1");Type[] Type = a.GetTypes();for (int i = 0; i < Type.Length; i++){Console.WriteLine(Type[i]);}Type player = a.GetType("ClassLibrary1.Player");MemberInfo[] Minfo= player.GetMembers();foreach (MemberInfo mi in Minfo){Console.WriteLine(mi);}FieldInfo field = player.GetField("Name");object obj = Activator.CreateInstance(player);//得到PlayerAttribute的TypeType attribute = a.GetType("ClassLibrary1.PlayerAttribute");if (field.GetCustomAttribute(attribute) != null){//通过得到的特性Type来判断field成员有没有该特性//有的话Console.WriteLine("不能修改该成员");}else{ //没有就可以设置名字field.SetValue(obj, "好名字");Console.WriteLine(field.GetValue(obj));}}
}