C 反射手記

2021-07-26 13:56:57 字數 3891 閱讀 8317

可以把 testinte***ce 塊裡的方法放進 main 執行來對應的理解

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.text;

using system.threading.tasks;

namespace reflectionlearn

#region testinte***ce

#region getmembers

private

static

void

printclasspublicinfo(type vartype)

private

static

void

printclassallinfo(type vartype)

private

static

void

printclassselfinfo(type vartype)

private

static

void

printclassselfincluestaticinfo(type vartype)

#endregion

#region getfields

private

static

void

printclassfieldsinfo()

if (tempinfo.name == "k__backingfield")

console.writeline("名稱: " + tempinfo.name + " -- 型別: " + getmembertype(tempinfo.membertype) + " - 值: " + tempinfo.getvalue(temprc));

}console.readkey();

}private

static

void

printclasspropertyinfo()

返回值型別: 引數數量: msil**長度: 區域性變數數量:",

tempgetinfo.name, tempgetinfo.returntype.tostring(),

tempgetinfo.getparameters().count(),

tempgetinfo.getmethodbody().getilasbytearray().length,

tempgetinfo.getmethodbody().localvariables.count);

methodinfo tempsetinfo = tempinfo.getsetmethod(true);

console.writeline("get方法的名稱 返回值型別: 引數數量: msil**長度: 區域性變數數量:",

tempsetinfo.name, tempsetinfo.returntype.tostring(),

tempsetinfo.getparameters().count(),

tempsetinfo.getmethodbody().getilasbytearray().length,

tempsetinfo.getmethodbody().localvariables.count);

tempsetinfo.invoke(temprc, new

object );

object obj = tempgetinfo.invoke(temprc, null);

console.writeline("方法名: 內部值:", tempinfo.name, obj);

}console.readkey();

}#endregion

#region staticmethods

private

static

void

printclassstaticmethodinfo()

);methodbody mbody = tempinfo.getmethodbody();

console.writeline("擁有引數的方法名: 返回值型別: 引數1型別: 引數1名稱: 方法呼叫後返回的值:",

tempinfo.name,

tempinfo.returntype.tostring(),

tempinfo.getparameters()[0].parametertype.tostring(),

tempinfo.getparameters()[0].name,

obj.tostring());

}else

返回值型別:",

tempinfo.name,

tempinfo.returntype.tostring());}}

console.readkey();

}#endregion

#endregion

#region logicbusiness

private

static

void

showmemberconsoleinfo(memberinfo varmeminfos)

console.readkey();

}private

static

string

getmembertype(membertypes varmemtype)

break;

case membertypes.method:

break;

case membertypes.property:

break;

case membertypes.constructor:

break;

case membertypes.custom:

break;

case membertypes.event:

break;

case membertypes.nestedtype:

break;

case membertypes.typeinfo:

break;

default:

break;

}return temptypestr;

}#endregion

}#region defineinfo

public

class refclass

protected

int mproteint;

public

int pintmember

public customclassone mcustomclass;

public

void

anyone()

public

static

void

thisisstaticmethodone()

public

static

void

thisisstaticmethodtwo()

public

static

string

hadreturnvaluea(string varstr)

public

static

string

hadreturnvalueb(string varstr)

}public

class customclass

public

class customclassone : customclass

public

class customclasstwo : customclass

#endregion

}

反射手冊筆記 3 使用物件

本章是上一章的繼續,再獲取到物件型別後,接下來做的事情。第一部分 動態呼叫成員 呼叫方法,檢索或更改屬性,以及字段 方法1 利用info類呼叫類成員 1.用methodinfo類呼叫方法 object invoke object obj,object parameters 其中,第1個引數obj,是...

《C 技術揭密》手記

2007 12 26 19.5,這個例子。把commprotocol及其子類都放在乙個專案中,然後單獨生成幾個類的dll檔案,然後編譯專案,編譯成功。執行時卻總會報乙個commprotocol同時存在於和中,省略號為guid,看起來感覺這個類應該同時存在於兩個dll中,可是dll就這麼幾個,還有別的...

c so 反射 C 實現反射機制

net下的很多技術都是基於反射機制來實現的,反射讓.net平台下的語言變得得心應手。最簡單的,比如列舉型別,我們我可以很容易的獲得乙個列舉變數的數值以及其名稱字串。可是,在c 中,列舉變數本質上和乙個整形變數沒有區別,我們很難獲取乙個列舉變數的名稱字串。其實在c 中,我們可以通過巨集來實現類似反射的...