说明都在代码的注释当中!
using System;
using System.Reflection;
namespace WhyUseDynamicInCSharp
{
class Student
{
public void EatFood(string name)
{
Console.WriteLine("大家好,我是 {0},我正在吃饭!", name);
}
public DateTime ReadArticles(string name)
{
Console.WriteLine("大家好,我是 {0},我正在读文章!", name);
return DateTime.Now;
}
}
class Program
{
static void Main(string[] args)
{
CommonInvoke();
ReflectInvoke();
DynamicInvoke();
}
/// <summary>
/// 普通调用
/// </summary>
static void CommonInvoke()
{
Student stu = new Student();
stu.EatFood("张三");
stu.ReadArticles("张三");
Console.WriteLine();
}
/// <summary>
/// 反射调用
/// </summary>
static void ReflectInvoke()
{
Assembly currenAassembly = Assembly.GetExecutingAssembly(); // 如果在另外的程序集中,则 Assembly.Load("WhyUseDynamicInCSharp")
Type studentType = currenAassembly.GetType("WhyUseDynamicInCSharp.Student");
// 注意:这里的 GetType 方法需要命名空间,如果 Student 直接属于程序集下面,就不需要
object objStudent = Activator.CreateInstance(studentType);
string studentName = "李四";
string methodName = "EatFood";
MethodInfo methodInfo = studentType.GetMethod(methodName);
methodInfo.Invoke(objStudent, new object[] { studentName}); // 由于这个 EatFood 方法没有返回值,所以 Invoke 返回 Null
methodName = "ReadArticles";
methodInfo = studentType.GetMethod(methodName);
DateTime invokeReturnTime = (DateTime) methodInfo.Invoke(objStudent, new object[] { studentName });
Console.WriteLine("反射调用完毕!返回的时间:" + invokeReturnTime);
Console.WriteLine();
}
/// <summary>
/// 动态调用
/// </summary>
static void DynamicInvoke()
{
Assembly currenAassembly = Assembly.GetExecutingAssembly(); // 如果在另外的程序集中,则 Assembly.Load("WhyUseDynamicInCSharp")
Type studentType = currenAassembly.GetType("WhyUseDynamicInCSharp.Student");
dynamic objStudent = Activator.CreateInstance(studentType);
string studentName = "王五";
objStudent.EatFood(studentName); // 将在运行时查找该对象的类型,检查该类型是否具有公共带参数的 EatFood 方法。
DateTime invokeReturnTime = objStudent.ReadArticles(studentName); // 同样也是在运行时查找
Console.WriteLine("动态调用完毕!返回的时间:" + invokeReturnTime);
Console.WriteLine();
}
}
}
运行结果截图:
谢谢浏览!