//代码
/***********************************************
*
* 使用反射技术,来进行“动态”调用。
* 缺点:运行速度慢
* 优点:可以使得类对象之间的调用关系,在“运行期”进行低耦合调用。
* 可以随着配置文件的改变,进行改变
*
*
*
* *********************************************/
using System;
using System.Reflection;
namespace 反射与特性
{
class Demo3
{
string strClassName = "Person"; //类的名称
string strMethodName = "Test1"; //方法的名称
/// <summary>
/// 通过反射调用方法与属性
/// </summary>
public void Test1()
{
//得到程序集对象
Assembly assObj = Assembly.LoadFrom(@"E:\TeacherLiuSutdy\Hight Level Teach\反射与特性\反射与特性\反射与特性\bin\Debug\netcoreapp2.0\反射与特性.dll");
//得到Type
Type typeObj = assObj.GetType("反射与特性." + "Person"); //命名空间.类名
//创建对象
object obj = Activator.CreateInstance(typeObj);
//得到方法
MethodInfo metInfo = typeObj.GetMethod(strMethodName);
//调用无惨方法
metInfo.Invoke(obj,null); //null表示方法没有参数
}
/// <summary>
/// 带参方法的调用
/// </summary>
///
public void Test2()
{
//得到程序集对象
Assembly assObj = Assembly.LoadFrom(@"E:\TeacherLiuSutdy\Hight Level Teach\反射与特性\反射与特性\反射与特性\bin\Debug\netcoreapp2.0\反射与特性.dll");
//得到Type
Type typeObj = assObj.GetType("反射与特性." + "Person"); //命名空间.类名
//创建对象
object obj = Activator.CreateInstance(typeObj);
//得到方法
MethodInfo metInfo = typeObj.GetMethod("Test2");
//调用无惨方法
object[] objArray = new object[1];
objArray[0] = "张三";
metInfo.Invoke(obj, objArray); //null表示方法没有参数
}
/// <summary>
/// 重载方法调用(无参数)
/// </summary>
public void Test3()
{
//得到程序集对象
Assembly assObj = Assembly.LoadFrom(@"E:\TeacherLiuSutdy\Hight Level Teach\反射与特性\反射与特性\反射与特性\bin\Debug\netcoreapp2.0\反射与特性.dll");
//得到Type
Type typeObj = assObj.GetType("反射与特性." + "Person"); //命名空间.类名
//创建对象
object obj = Activator.CreateInstance(typeObj);
//得到方法
MethodInfo metInfo = typeObj.GetMethod("Test3",new Type[0]);//Type[0] 表示重载方法无参
metInfo.Invoke(obj, null); //null表示方法没有参数
}
/// <summary>
/// 带参方法重载的调用
/// </summary>
public void Test4()
{
//得到程序集对象
Assembly assObj = Assembly.LoadFrom(@"E:\TeacherLiuSutdy\Hight Level Teach\反射与特性\反射与特性\反射与特性\bin\Debug\netcoreapp2.0\反射与特性.dll");
//得到Type
Type typeObj = assObj.GetType("反射与特性." + "Person"); //命名空间.类名
//创建对象
object obj = Activator.CreateInstance(typeObj);
//得到方法
Type[] typeArrayWtihPara = { typeof(int) };//确定方法重载中有参数
MethodInfo metInfo = typeObj.GetMethod("Test3", typeArrayWtihPara);//typeArrayWtihPara 表示重载方法有参
object[] objArray = new object[1];
objArray[0] = 1100;
metInfo.Invoke(obj, objArray); //null表示方法有参数
}
static void Main(string[] args)
{
Demo3 obj = new Demo3();
obj.Test1(); //无参方法调用,调用调用Person类中的Test1()
obj.Test2(); //有参方法调用,调用调用Person类中的Test2(string str)
obj.Test3(); //无参重载方法调用,调用Person类中的Test3()
obj.Test4(); //带参重载方法调用,调用Person类中的Test3(int num)
Console.ReadKey();
}
}
}
//Person调用类
using System;
namespace 反射与特性
{
public class Person
{
public string Name;
public int Age;
private int _ID;
//属性
public int ID
{
get { return _ID; }
set { _ID = value; }
}
//方法
public void DisplayID()
{
Console.WriteLine(_ID);
}
public void DisplayName()
{
Console.WriteLine(Name);
}
public void DisplayAge()
{
Console.WriteLine(Age);
}
/*调用方法测试*/
public void Test1()
{
Console.WriteLine("Person 类Test1 无参数方法");
}
public void Test2(string str)
{
Console.WriteLine("Person 类Test2 有参数方法,参数=" + str);
}
public void Test3()
{
Console.WriteLine("Person 类Test3 无参数方法");
}
public void Test3(int num)
{
Console.WriteLine("Person 类Test3 有参数方法,参数=" + num);
}
}
}