假設我們有以下的泛型方法
public t fun()
如果t有很多,那通常的方法是使用swich進行判斷
var classname = "string";
var obj = new object();
swich(classname)
解決方案
上面的寫法會導致大量的冗餘**。
我們想要如下的解決方案,通過傳入類的名字來動態的呼叫fun函式
//錯誤的方案
public object excutemethod(string classname)
泛型中的t是型別,而這裡使用的type是引數。沒有找到辦法把型別當作引數傳遞。但是可以換一種思路,通過反射來直接執行函式。
以下是通過放射實現動態執行泛型函式
//獲取當前程式集
assembly mockassembly = assembly.getexecutingassembly();
//可以使用loadfrom(url)方法載入其他程式集(.dll檔案),url是絕對路勁
assembly mockassembly = assembly.loadfrom("c:/test/test.dll");
//通過類名獲取類,引數是類的全名,命名空間+類名,myclass是泛型方法中fun()中的t
var curtype = mockassembly.gettype("myspacename.myclass");
//獲取方法所在類的type,methodclass是存放fun()方法的類
var methodtype = typeof(methodclass);
//如果是泛型類,如 mygenericclass{},要這樣獲得type
var methodtype = typeof(mygenericclass<>);
//獲取泛型方法,
var genericmethod =methodtype.getmethod(methodname);
//如果方法是多型的,即有多個同名方法,可以通過傳入type引數來找到方法
//這樣可以找到方法fun(string para1,int para2)
var genericmethod =methodtype.getmethod(
methodname, new type );
//合併生成最終的函式
methodinfo curmethod =genericmethod.makegenericmethod(curtype);
//執行函式
//如果要執行的是靜態函式,則第乙個引數為null
//第二個引數為引數值
//即要呼叫的函式應該為 static fun(string para1,int para2)
curmethod.invoke(null, new object);
函式呼叫做為左值
返回乙個引用,使得乙個函式呼叫表示式成為左值表示式。只要避免將區域性變數的位址返回,就能使函式呼叫表示式作為左值來使用,執行的很好。example 統計學生中a類學生與b類學生各佔多少。a類學生的標準時平均分在80分以上,其餘都是b類學生,先看不返回引用的情況 include using names...
Golang反射呼叫函式
首先,來看看這段 php view source print?1functionfoobar 4 funcs array 5 foobar foobar 6 hello foobar 7 8 funcs foobar 9 funcs hello 它會輸出 view source print?1mik...
c 簡易反射呼叫泛型方法
所謂程式集的簡單理解,存在不同專案中 不是解決方案 即using前需要引用 dll 1 呼叫當前類檔案下的方法public listgetbycondition operatelogmodel model methodinfo servicemethod this.gettype getmethod...