反射生成陣列

2021-08-22 20:15:50 字數 1427 閱讀 2251

兩個月前寫了一篇《對泛型進行反射》的文章,沒什麼人看,小傷心一下:(

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

其實反射陣列最難無非就是陣列的初始化和陣列的索引了,那麼,如何初始化乙個陣列呢,陣列是沒有建構函式的,那麼用

invokemember(

null

,bindingflags.declaredonly|

bindingflags.public|bindingflags.nonpublic|

bindingflags.instance|bindingflags.createinstance,null,null,new

object{})

是肯定不行的,用getmethods來看看,這個型別都有哪些方法,

typet=type.gettype("system.int32");

foreach(methodinfomiint.getmethods(bindingflags.public|bindingflags.instance))

結果如下:

那我們來呼叫一下看看:

typet=type.gettype("system.int32");

intarray=new

int[10];//初始化陣列長度為10

array=(int)(t.invokemember("set",bindingflags.createinstance,null,array,new

object));//這裡將它的長度變為5看看是否能成功

console.writeline(array.length);

可以看到,輸出結果為5,這證明,的確是用set方法來初始化陣列的。

接下來,我們就會想,如何為陣列的元素賦值及如何獲取它們的值呢?

再次看一下上面的方法列表,可以看到有getvalue與setvalue方法,那我們來試試:

typet=type.gettype("system.int32");

objectarray=new

object();

array=t.invokemember("set",bindingflags.createinstance,null,array,new

object);

for(inti=0;i<10;i++)

t.getmethod("setvalue",newtype[2]).invoke(array,new

object);

for(inti=0;i<10;i++)

console.writeline(t.getmethod("getvalue",newtype).invoke(array,new

object));

結果如下:

可以看到,getvalue與setvalue有多個過載版本,如果想要反射多維陣列,就要用到不同的過載,有興趣的朋友可以自己試試。

反射生成陣列

兩個月前寫了一篇 對泛型進行反射 的文章,沒什麼人看,小傷心一下 今天在論壇有人問怎樣反射生成陣列,突然又來了興致,決定試試 其實反射陣列最難無非就是陣列的初始化和陣列的索引了,那麼,如何初始化乙個陣列呢,陣列是沒有建構函式的,那麼用 invokemember null bindingflags.d...

深入反射生成陣列的詳解

今天在論壇有人問怎樣反射生成陣列,突然又來了興致,決定試試 其實反射陣列最難無非就是陣列的初始化和陣列的索引了,那麼,如何初始化乙個陣列呢,陣列是沒有建構函式的,那麼用invokemember null,bindingflags.declaredonly bindingflags.public bi...

動態生成陣列

動態生成一維陣列 quint32 count map nodecount qstring name new qstring count 動態生成name一維陣列,儲存點的名字 動態生成二維陣列 quint32 linkatrix linkatrix quint32 malloc sizeof qui...