您的位置:首页 > 编程语言

代码演示 .NET 中普通方法的调用、反射调用、动态(Dynamic)调用的区别

2011-12-10 22:11 525 查看
说明都在代码的注释当中!

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();

}
}
}


运行结果截图:



谢谢浏览!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: