考慮了一下,將字段實現給貼了出來,但是說實話,我琢磨不定哪乙個是最佳方案(原因如下)。
**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...