class Test
{
private int i = 1;
public int j = 0;
public string str = "123";
public Test()
{
}
public Test(int i)
{
this.i = i;
}
public Test(int i,string str):this(i)
{
this.str = str;
}
public void Speak()
{
Console.WriteLine(i);
}
}
class Program
{
static void Main(string[] args)
{
Type type1 = typeof(int);
Type type2 = Type.GetType("System.Int32");
//通过Type可以得到类型所在程序集信息
Console.WriteLine(type1.Assembly );
Console.WriteLine(type2.Assembly );
Console.WriteLine("****************************");
Console.WriteLine("****************************");
//获取类中的所有公共成员
//1首先得到Type
Type t = typeof(Test);
//然后得到所有公共成员
MemberInfo[] infos = t.GetMembers();
for (int i = 0; i < infos.Length ; i++)
{
Console.WriteLine(infos[i]);
}
Console.WriteLine("****************************");
Console.WriteLine("****************************");
//获取所有构造函数
ConstructorInfo[] ctors = t.GetConstructors();
for (int i = 0; i < ctors.Length; i++)
{
Console.WriteLine(ctors[i]);
}
Console.WriteLine("****************************");
Console.WriteLine("****************************");
//2获取其中一个构造函数 并执行
//得到构造函数传入 Type数组 数组中内容按顺序是参数类型
//执行构造函数传入 object数组 表示按顺序传入的参数
// 2-1 得到无参构造
Type[] ty = new Type[0] {};//没有参数
ConstructorInfo info = t.GetConstructor(new Type[0]);
Test obj= info.Invoke(null) as Test ;
Console.WriteLine(obj.j );
Console.WriteLine("****************************");
Console.WriteLine("****************************");
//2-2得到有参构造
ConstructorInfo info1 = t.GetConstructor(new Type[] { typeof(int) });
obj = (Test)info1.Invoke(new Object[] { 5});
//通过反射获取对象的值
FieldInfo fis = t.GetField("i",BindingFlags.NonPublic|BindingFlags.Instance );
Object in1= fis.GetValue(obj);
Console.WriteLine(in1);
Console.WriteLine("****************************");
Console.WriteLine("****************************");
//通过反射设置对象的值
fis.SetValue(obj, 100);
Object in2 = fis.GetValue(obj);
Console.WriteLine(in2);
Console.WriteLine("****************************");
Console.WriteLine("****************************");
//获取类的公共成员方法
//通过Type类中的GetMethod方法 得到类中参数类型
//MethodInfo 是方法的反射信息
//1、如果存在方法重载 用type数组表示参数类型
Type strtype = typeof(string);
MethodInfo[] method = strtype.GetMethods(); //获取多个方法
for (int i = 0; i < method.Length; i++)
{
Console.WriteLine(method[i]);
}
//2 调用该方法
//注意:如果是静态方法 invoke中的第一参数传null即可
Console.ReadKey();
}
}
标签:反射,Console,int,WriteLine,Test,Type,public
From: https://www.cnblogs.com/L-love-Z/p/17038923.html