首先還是聲明一下,使用場景:
1、如果編譯時函數名稱確定,對象類型運行時確定,那么運用dynamic是一個好主意。
2、如果編譯時函數名稱確定,對象類型在編譯時也確定,那就既不需要反射也不需要dynamic。
3、如果函數名稱在運行時才能確定的話,那函數名稱就是一個字符串,必須使用反射來完成。
那么我們肯定是是在第一種情況中使用dynamic類型改進反射:(編譯時函數名稱確定,對象類型運行時確定)
假設我們需要反射調用的函數是:
namespace ClassLibrary
{
public class Demo
{
public string GetName()
{
String name = "dddd";
return name;
}
}
}
傳統的調用一般是:
static void Main(string[] args)
{
Type typeinfo = Assembly.Load("ClassLibrary").GetType("ClassLibrary.Demo");
object instance = Assembly.Load("ClassLibrary").CreateInstance("ClassLibrary.Demo");
MethodInfo me = typeinfo.GetMethod("GetName");
object ret = me.Invoke(instance, null);
Console.WriteLine(ret.ToString());
}
使用dynamic改良之后:
class Program
{
static dynamic reflectObj = null;
static void Main(string[] args)
{
if (reflectObj == null)
{
reflectObj = Assembly.Load("ClassLibrary").CreateInstance("ClassLibrary.Demo");
}
object rrr = reflectObj.GetName();
Console.WriteLine(rrr.ToString());
Console.ReadKey();
}
}
少了一步反射生產 函數 的步驟,也對我們后面進行的反射性能調優有着非常大的幫助:)