C# 反射
2021-05-23 00:29
标签:字符 tco com 框架 位置 rtu 直接 技术 main 反射: 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 优点: 缺点: 可通过类名、成员的名字类进行对象的实例化、操作类成员 当然了还有很多时候是要通过exe 或者dll 来操作的 这里新建了一个控制台应用程序 在main 方法中 Console.WriteLine("要输出的内容"); 并且将main 函数中的参数改为无参的 参考:https://www.bilibili.com/video/av29432157?t=1973 、https://www.runoob.com/csharp/csharp-reflection.html C# 反射 标签:字符 tco com 框架 位置 rtu 直接 技术 main 原文地址:https://www.cnblogs.com/zeng-qh/p/11158273.html优缺点
class person//默认partial
{
public int show(int a)
{
return a;
}
public string show(int a, double c)
{
return a+""+c;
}
public void showA() { }
public static void ShowB() { }
private void ShowC() { }
private static void ShowD() { }
public int a;
public static int b;
private int c;
private static int d;
private person(int a, string B)
{
Console.WriteLine(a + "person类有参函数被调用" + B);
}
public person()
{
Console.WriteLine("person类无参函数被调用");
}
}
//通常person p=new person();
//反射:
/*BindingFlags: 要访问的方法或字段的权限描述 ,必须要同时具备两个描述
1.要有要访问的成员的访问权限描述
2.要有访问的成员的归属 (静态的是Static 非静态是Instance)
*/
//通过类名获取一个类型 注意:命名空间
Type T = Type.GetType("ConsoleApp1.person");
//默认会使用public 权限的无参构造方法来实例化
object obj = Activator.CreateInstance(T);
//若为true 表示可以匹配任何权限的无参构造函数
object obj1 = Activator.CreateInstance(T, true);
//public 权限的 有参构造方法
//object obj2 = Activator.CreateInstance(T, 2, "aaa");
//非public 权限的 有参构造方法
object obj3 = Activator.CreateInstance(T, System.Reflection.BindingFlags.NonPublic | BindingFlags.Instance, null, new Object[] { 1, "BBB" }, null);
//通过反射访问类中的字段
//1 public 非静态 a
FieldInfo a = T.GetField("a");
a.SetValue(obj, 2);
Object aa = a.GetValue(obj);
//2访问public 静态 b
FieldInfo b = T.GetField("b", BindingFlags.Public | BindingFlags.Static);
b.SetValue(null, 3);//要访问的是一个静态成员 访问主体是null
object bb = b.GetValue(obj);
//3访问public 非静态 c
FieldInfo c = T.GetField("c", BindingFlags.NonPublic | BindingFlags.Instance);
c.SetValue(obj, 5);
object cc = c.GetValue(obj);
//4访问private 静态 d
FieldInfo d = T.GetField("d", BindingFlags.NonPublic | BindingFlags.Static);
d.SetValue(null, 6);//要访问的是一个静态成员 访问主体是null
object dd = d.GetValue(obj);
//通过反射访问方法
//public 方法A
MethodInfo method = T.GetMethod("ShowD", BindingFlags.NonPublic | BindingFlags.Static);
method.Invoke(null, null);
//public 静态方法
//private 方法C
//private 静态方法
//获取有参函数 注意:字符串的大小写
MethodInfo info = T.GetMethod("show", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(int) }, null);
//type 数组传 方法的参数列表
object x = info.Invoke(obj, new object[] { 1 });
Console.WriteLine(x);
string dllName = "ConsoleApp2";//指定dll文件的名字 程序集的名字
string FullName = "ConsoleApp2.Program";//指定程序及的名字+类的名字
Assembly assembly = Assembly.Load(dllName);//加载程序集
Type type = assembly.GetType(FullName);//从程序集中获取指定对象的类型
object xa = Activator.CreateInstance(type);//创建实例
MethodInfo methodx = type.GetMethod("Main", BindingFlags.NonPublic | BindingFlags.Static);
methodx.Invoke(null, null);//这里如果说在ConsoleApp2 中main函数是传入参数要对应
/*static void Main(string[] args)
{ }
*/