反射類呼叫做引數呼叫泛型函式

2021-09-01 12:26:53 字數 1409 閱讀 6362

假設我們有以下的泛型方法

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...