深入反射生成陣列的詳解

2022-09-26 09:18:09 字數 1520 閱讀 4332

今天在論壇有人問怎樣反射生成陣列,突然又來了興致,決定試試

其實反射陣列最難無非就是陣列的初始化和陣列的索引了,那麼,如何初始化乙個陣列呢,陣列是沒有建構函式的,那麼用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...