Emit實現DataRow轉化成強型別的T

2022-02-24 01:39:40 字數 1999 閱讀 3309

來已經很多年了,一直很懶,沒寫過部落格,都是偷偷的關注園子裡大牛門

看他們的動向,跟著他們的腳步學習知識。

這次也算是一點反饋吧,記得前一段時間看過乙個園友寫過乙個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 user

public 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...