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