C#反射
2021-06-11 18:05
标签:vat 赋值 val str intern span setvalue 获取 方法 C#反射 标签:vat 赋值 val str intern span setvalue 获取 方法 原文地址:https://www.cnblogs.com/zySun622/p/10556128.htmlusing System;
using System.Reflection; //反射
//反射:可以通过类名、成员的名字来进行对象的实例化、操作类成员
class Person
{
public int a;
private int b;
public static int c;
private static int d;
//private Person()
//public Person()
internal Person()
{
Console.WriteLine("Person类无参的构造方法被调用");
Console.ReadLine();
}
private Person(int a, double b, string c)
{
Console.WriteLine("Person类有参的构造方法被调用");
Console.ReadLine();
}
public void ShowA() { }
private void ShowB() { }
public static void ShowC() { }
private static void ShowD() { }
public int Show(int a, double b) {
return a;
}
private double Show(double a, int b)
{
return b;
}
}
class Program
{
static void Main(string[] args)
{
//实例化一个Person对象
//通过类名来获取一个类型
//命名空间:如果这个类在一个命名空间中,那么在写类型名的时候需要加上命名空间
//例如:systm.Int32
Type t = Type.GetType("Person");
//实例化一个对象,默认使用public权限的无参的构造方法来实例化
// object obj = Activator.CreateInstance(t);
//实例化一个对象,true表示如果公共或非公共默认构造函数都可以匹配
//fales 表示只有公共的默认构造函数可以匹配
//object obj = Activator.CreateInstance(t,true );
//实例化一个对象,是通过public权限的有参的构造方法来实例化
//object obj = Activator.CreateInstance(t, 1,3.1,"hello");
//实例化一个对象,通过非public权限的有参构造方法来实例化
object obj = Activator.CreateInstance(t, BindingFlags.NonPublic|BindingFlags.Instance,null,new object[]{ 1,2.3,"hello"},null);
//BindingFlags:要访问的方法或字段的权限描述,必须要同时具备两个描述
//1.要有要访问的成员的权限描述 BindingFlags.NonPublic BindingFlags.Public
//2.要有要访问的成员的归属 静态的:BindingFlags.Static 非静态的:BindingFlags.Instance
//通过反射访问类中的字段
//1.访问public权限的非静态的字段a
FieldInfo a = t.GetField("a");
a.SetValue(obj,1); //给obj对象的a字段进行赋值,值为1
object aa = a.GetValue(obj); //获取对象obj的字段a的值
//2.访问private权限的非静态的字段b
FieldInfo b = t.GetField("b",BindingFlags.NonPublic|BindingFlags.Instance);
b.SetValue(obj, 3);
object bb = b.GetValue(obj);
//3.访问public权限的静态的字段c
FieldInfo c = t.GetField("c", BindingFlags.Public | BindingFlags.Static);
c.SetValue(null,5); //如果要访问的是一个静态的成员,则访问的主体是null
object cc = c.GetValue(null);
//4.访问private权限的静态的字段d
FieldInfo d = t.GetField("d", BindingFlags.NonPublic | BindingFlags.Static);
d.SetValue(null, 3);
object dd = d.GetValue(null);
//通过反射访问类中的方法
//1.获取没有参数的方法
MethodInfo method0 = t.GetMethod("ShowD", BindingFlags.NonPublic | BindingFlags.Static);
//方法调用,第一个参数是谁在调用方法,第二个参数是调用的方法的实参列表
method0.Invoke(null,null);
//2.获取有参数有重载的方法
//Type数组中传要访问的方法的参数类型列表
//typeof 来获取已知类型
MethodInfo method1 = t.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance, null,new Type[] {typeof(int),typeof(double)},null);
//第二个参数是实参列表
//Invoke方法的返回值,就是method1方法的返回值
object result = method1.Invoke(obj, new object[] { 1, 1.45 });
Console.WriteLine(result);
}
}