來已經很多年了,一直很懶,沒寫過部落格,都是偷偷的關注園子裡大牛門
看他們的動向,跟著他們的腳步學習知識。
這次也算是一點反饋吧,記得前一段時間看過乙個園友寫過乙個datatable轉換成list的文章
受到了不少啟發,於是有了下面的一小段**,寫他的目的也不算是重複的造輪子,只是為了溫習一下emit
不然久了真的忘記了。
廢話少說了,直接上**,有注釋的哦,我就不解釋了
想學習emit的同學可以對照opcodes的指令來看,肯定會有收穫的
static funccreatefunc() where t : new(), true);
ilgenerator il = method.getilgenerator();
//new乙個需要返回的物件
il.declarelocal(classtype);
il.emit(opcodes.newobj, classtype.getconstructor(type.emptytypes));
il.emit(opcodes.stloc_0); //var t = new t()
//取出dr中所有的列名集合
il.declarelocal(typeof(datacolumncollection));
il.emit(opcodes.ldarg_0);
il.emit(opcodes.callvirt, typeof(datarow).getmethod("get_table"));
il.emit(opcodes.callvirt, typeof(datatable).getmethod("get_columns"));
il.emit(opcodes.stloc_1); //var columns = dr.table.columns
var props = classtype.getproperties(bindingflags.instance | bindingflags.getproperty | bindingflags.setproperty | bindingflags.public);
foreach (var property in props)
)); //var temp = dr["xx"]
//對取出的值拆箱
il.emit(opcodes.unbox_any, property.propertytype);
var temp = il.declarelocal(property.propertytype);
il.emit(opcodes.stloc, temp);
= temp
il.emit(opcodes.ldloc_0);
il.emit(opcodes.ldloc, temp);
il.emit(opcodes.callvirt, property.getsetmethod());
il.marklabel(label);
}il.emit(opcodes.ldloc_0);
il.emit(opcodes.ret);
return method.createdelegate(typeof(func)) as func;
}
下面給出乙個測試的**片段
public class userpublic string name
}
var func = createfunc();datatable dt = new datatable();
dt.columns.add("id", typeof(int));
"name", typeof(string));
var dr = dt.newrow();
dr[0] = 13;
//dr[1] = "coffee";
dt.rows.add(dr);
var user = func(dr);
第一次發文,斗膽放上首頁,請各位大牛不吝賜教~~~
反射的Emit實現 2
考慮了一下,將字段實現給貼了出來,但是說實話,我琢磨不定哪乙個是最佳方案 原因如下 public class user set internal int?id public int?id set 也就是說,字段必須是internal屬性。囧 public class fieldproperty t ...
通過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...