今天在論壇有人問怎樣反射生成陣列,突然又來了興致,決定試試
其實反射陣列最難無非就是陣列的初始化和陣列的索引了,那麼,如何初始化乙個陣列呢,陣列是沒有建構函式的,那麼用invokemember(null, bindingflags.declaredonly |bindingflags.public | bindingflags.nonpublic |bindingflags.instance | bindingflags.createinstance, nlldafjull, null, new object )
是肯定不行的,用getmethods來看看,這個型別都有哪些方法。
複製** **如下:
type t = type.gettype("system.int32");
foreach(methodinfo mi in t.getmethods(bindingflags.public | bindingflags.instance))
結果如下:
我們看到,有程式設計客棧乙個名為set的方法,這個會不會就是呢?
那我們來呼叫一下看看:
複製** **如下:
type t = type.gettype("system.int32");
int array = new int[10];//初始化陣列長度為10
array = (int)(t.invokemember("set", bindingflags.createinstance,null, array, new object ));//這裡將它的長度變為5看看是否能成功
console.writeline(array.length);
可以看到,輸出結果為5,這證明,的確是用set方程式設計客棧法來初始化陣列的。
接下來,我們就會想,如何為陣列的元素賦值及如何獲取它們的值呢?
再次看一下上面的方法列表,可以看到有getvalue與setvalue方法,那我們來試試:
複製** **如下:
type t = type.gettype("system.int32");
object array = new object();
array = t.invokemember("set", bindingflags.createinstance, null, array, new object );
for (int i = 0; i < 10程式設計客棧; i++)
t.getmethod("setvalue", new type[2] ).invoke(array, new object );
for (int i = 0; i < 10; i++)
console.writeline(t.getmethod("getvalue", new type ).invoke(array, new object ));
結果如下:
呼叫成功,其實還是比較簡單的。
可以看到,getvalue與setvalue有多個過載版本,如果想要反射多維陣列,就要用到不同的過載,有興趣的朋友可以自己試試。
本文標題: 深入反射生成陣列的詳解
本文位址:
反射生成陣列
兩個月前寫了一篇 對泛型進行反射 的文章,沒什麼人看,小傷心一下 今天在論壇有人問怎樣反射生成陣列,突然又來了興致,決定試試 其實反射陣列最難無非就是陣列的初始化和陣列的索引了,那麼,如何初始化乙個陣列呢,陣列是沒有建構函式的,那麼用 invokemember null bindingflags.d...
反射生成陣列
兩個月前寫了一篇 對泛型進行反射 的文章,沒什麼人看,小傷心一下 今天在論壇有人問怎樣反射生成陣列,突然又來了興致,決定試試 其實反射陣列最難無非就是陣列的初始化和陣列的索引了,那麼,如何初始化乙個陣列呢,陣列是沒有建構函式的,那麼用 invokemember null bindingflags.d...
動態生成陣列
動態生成一維陣列 quint32 count map nodecount qstring name new qstring count 動態生成name一維陣列,儲存點的名字 動態生成二維陣列 quint32 linkatrix linkatrix quint32 malloc sizeof qui...