C 反射呼叫程式集類中方法

2022-03-30 08:42:54 字數 3906 閱讀 2586

建立類

class

operatorclass

//////

減法

///

//////

///public

static

int subtract(int x, int

y)

//////

乘法

///

//////

///public

int mulitiple(int x, int

y)

//////

除法

///

//////

///public

int divide(int x, int

y)

return x /y;

}//////

取餘數求餘

///

//////

///public

int remain(int x, int

y)

return x %y;

}//////

獲取陣列的最大數以及最大數所在的索引

///

///陣列

///輸出最大值的所在的索引

///public

int getmaxnumber(int array, out

intmaxindex)

int max = array[0]; maxindex = 0

;

for (int i = 1; i < array.length; i++)

} return

max;

}//////

獲得不定項陣列的長度

///

//////

public

int getvaryarraylength(params

int array)

return

array.length;

}//////

測試帶ref的引數

///

//////

public

void testreference(int inparameter, ref

intrefparameter)

public

bool teststring(string s1, string

s2)

//////

私有方法無法通過反射得到該方法的資訊

///

private

void

privatemethod()

}

引導程式集的類,獲得其中的方法

assembly assembly = assembly.load("

testclasslibrary");

console.writeline(

"程式集資訊:\n

" +assembly.fullname);

console.writeline();

type ts = assembly.gettypes();//

獲得程式集中定義的型別             

for (int i = 0; i < ts.length; i++)

:的所有公共方法:

", i + 1

, typefullname);

methodinfo mis = ts[i].getmethods();//

返回當前型別的所有公共方法 

for (int j = 0; j < mis.length; j++)

:,返回值的型別:,是靜態方法:",

j + 1, mis[j].name, mis[j].returntype, mis[j].isstatic); parameterinfo paras = mis[j].getparameters();//

獲取指定的方法或建構函式的引數資訊 

for (int k = 0; k < paras.length; k++)

: ,簽名位置:,是輸出引數:",

k + 1

, paras[k].parametertype, paras[k].name, paras[k].position, paras[k].isout);}}

console.writeline();

}

方法的呼叫

///

///測試呼叫類庫中的方法         

///static

void

testinvokemethod()

.", "

testclasslibrary

", "

operatorclass

"));

console.writeline(

"呼叫testclasslibrary.operatorclass 類的公共靜態方法public static int add(int x, int y) 的例子");

system.reflection.methodinfo mi = ty.getmethod("

add"

);

//呼叫靜態方法add時,invoke的第乙個引數為null 

object returnvalue = mi.invoke(null, new

object );

console.writeline(

"add方法的返回值:\r\n

", returnvalue);

console.writeline(

"呼叫testclasslibrary.operatorclass 類的公共方法public int getmaxnumber(int array, out int maxindex) 的例子");

system.reflection.methodinfo mi1 = ty.getmethod("

getmaxnumber");

//呼叫例項化方法(非靜態方法)需要建立型別的乙個例項             

object instanceobject =activator.createinstance(ty);

int maxindex = -1

;

object parametersinfo = new

object , maxindex };

//呼叫例項化方法getmaxnumber時,invoke的第乙個引數是乙個例項化物件             

object returnvalue1 =mi1.invoke(instanceobject, parametersinfo);

maxindex = convert.toint32(parametersinfo[1

]); console.writeline(

"getmaxnumber方法的返回值(最大值):,最大值的索引:

", returnvalue1, maxindex);

system.reflection.methodinfo mi2 = ty.getmethod("

teststring");

object str = new

object ;

object returnvalue2 =mi2.invoke(instanceobject, str);

}

練習**

c 反射呼叫程式集方法 介面例項

新建類庫 webtest 新增相應類 reflecttest 介面inte ce1 using system using system.collections.generic using system.linq using system.text namespace webtest public c...

C 反射呼叫拓展類方法

今天封裝protobuf封包時候遇到乙個問題 protobuf的反序列化方法mergefrom,是寫在擴充套件類裡的 c 拓展類 通過反射獲取不到這個方法,就沒法使用type來泛型封裝.然而仔細一想,拓展類不也是類嗎,直接反射獲取拓展類方法好了 在看google.protobuf原始碼,找到這個類 ...

程式集反射 Type 類

type 類 表示型別宣告 類型別 介面型別 陣列型別 值型別 列舉型別 型別引數 泛型型別定義,以及開放或封閉構造的泛型型別。這個類是執行緒安全的。type 為 system.reflection 功能的根,也是訪問元資料的主要方式。使用 type 的成員獲取關於型別宣告的資訊,如建構函式 方法 ...