关键类Assembly和Activator

Activator

用于快速实例化对象的类

用于将Type对象快捷实例化为对象

先得到Type然后快速实例化一个对象

//无参构造函数
Type testType = typeof(Test);
Test testObj =Activator.CreateInstance(testType) as Test;
Console.WriteLine(testObj.str);
//有参构造
testObj = Activator.CreateInstance(testType,99) as Test;
Console.WriteLine(testObj.j);
testObj = Activator.CreateInstance(testType,55."111222") as Test;
Console.WriteLine(testObj.j);

Assembly

程序集类主要用来加载其他程序集,加载后才能用Type来使用其他程序集中得信息,如果想要使用不是自己程序集中的内容,需要先加载程序集,比如dll文件(库文件)

//三种加载程序集的函数
//一般用来加载同一文件下的其他程序集
//Assembly assembly2=Assembly.Load("程序集名")
//一般用来加载不在同一文件夹下的其他程序集
//Assembly assembly = Assembly.LoadFrom("包含程序集清单的文件的名称或路径");
//Assembly assembly3 = Assembly.LoadFile("要加载的文件的完全限定路径");
//先加载一个指定程序集
Assembly assembly = Assembly.LoadFrom(@"C:\Users\Administrator\source\repos\Cs核心\多线程习题\bin\Debug\net8.0\多线程习题");
//再加载程序集中的一个类对象,之后才能使用反射
Type icon = assembly.GetType("多线程习题.Star");
MemberInfo[] members = icon.GetMembers();
for (int i =0;i<members.Length;i++)
{
    Console.WriteLine(members[i]);
}
//通过反射实例化一个对象
//先得到枚举Type来得到可传入参数
Type moveDir = assembly.GetType("多线程习题.E_MoveDir");
FieldInfo right =moveDir.GetField("Right");
//直接实例化对象
object iconObj = Activator.CreateInstance(icon,10,5,right.GetValue(null));
//通过反射得到对象中的方法
MethodInfo move = icon.GetMethod("Move");
MethodInfo draw = icon.GetMethod("Draw");
MethodInfo clear = icon.GetMethod("Clear");
while(true)
{
    Thread.Sleep(1000);
    clear.Invoke(iconObj,null);
    move.Invoke(iconObj,null);
    draw.Invoke(iconObj,null);
}

类库工程的创建


posted @ 2025-03-14 18:15  cannedmint  阅读(11)  评论(0)    收藏  举报