反射的Emit實現 2

2022-01-24 01:08:26 字數 1695 閱讀 2242

考慮了一下,將字段實現給貼了出來,但是說實話,我琢磨不定哪乙個是最佳方案(原因如下)。

**public

class

user

set}internal

int?

_id;

public

int?

id  

set }

}也就是說,字段必須是internal屬性。 囧~~

**public

class

fieldproperty

<

t>

}private

type _ownertype;

public

fieldproperty(t owner)

private

dictionary

<

int, setvaluedelegatehandler

>

_cache 

=new

dictionary

<

int, setvaluedelegatehandler

>

();public

void

setpropertyvalue(

string

propertyname, 

object

value)

else

, this

._ownertype.module);

//獲取動態函式的 il 生成器

var il 

=method.getilgenerator();

//建立乙個本地變數,主要用於 object type to propety type

var local 

=il.declarelocal(filedinfo.fieldtype, 

true

);//

載入第 2 個引數【(t owner, object value)】的 value

il.emit(opcodes.ldarg_1);

if(filedinfo.fieldtype.isvaluetype)

else

il.emit(opcodes.stloc, local);

//將上面的拆箱或轉換,賦值到本地變數,現在這個本地變數是乙個與目標函式相同資料型別的字段了。

il.emit(opcodes.ldarg_0);   

//載入第乙個引數 owner

il.emit(opcodes.ldloc, local);

//載入本地引數

il.emit(opcodes.stfld, filedinfo);

//呼叫字段,新值賦予舊值

il.emit(opcodes.ret);   

//返回

/*生成的動態函式類似:

* void emitcallable(t owner, object value)

* */

sv =

method.createdelegate(

typeof

(setvaluedelegatehandler)) 

assetvaluedelegatehandler;

this

._cache.add(hashcode, sv);

}sv(

this

._owner, value);}}

用Emit技術替代反射

system.reflection.emit命名空間類可用於動態發出microsoft中間語言 msil 以便生成的 可以直接執行。反射也用於獲取有關類及其成員的資訊。換句話說,反射是一種技術,允許您檢查描述型別及其成員的元資料,你可能以程式設計方式訪問過元件物件模型型別庫,net中的反射非常相似,...

通過Emit實現動態類生成

麻煩歸麻煩,非不能也,動態生成乙個簡單的類還不至於太難。假設有如下介面 inte ce ianimal 希望能建立乙個類生成器typecreator,並能以以下方式使用 typecreator tc new typecreator typeof ianimal type t tc.build ian...

通過Emit實現動態類生成

麻煩歸麻煩,非不能也,動態生成乙個簡單的類還不至於太難。假設有如下介面 inte ce ianimal 希望能建立乙個類生成器typecreator,並能以以下方式使用 typecreator tc new typecreator typeof ianimal type t tc.build ian...