作者xanlich (...)
看板C_Sharp
標題[問題] 有關Activator.CreateInstance
時間Wed Jul 7 17:24:57 2010
這是MSDN上的範例:
Object o = Activator.CreateInstance(typeof(StringBuilder));
// Append a string into the StringBuilder object and display the
// StringBuilder.
StringBuilder sb = (StringBuilder) o;
sb.Append("Hello, there.");
Console.WriteLine(sb);
Activator.CreateInstance可以將Object o轉換成StringBuilder
然後還要將o轉型成StringBuilder, 才能呼叫sb.Append
我想問的問題是, 如果我有的資訊只有Type RRR, RRR可能是任何Type
Object o = Activator.CreateInstance(RRR);
但這樣我要怎樣才能把Object o轉換成RRR所代表的class,
不然我無法呼叫RRR包含的function, 謝謝~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.21.72
1F:→ pico2k:try use o.GetType()... 07/07 17:43
什麼意思啊? o.GetType() 拿到的值會等於 RRR
但還是不知道怎麼轉成RRR耶..
2F:→ optimist9266:既然你的Type可能是任何類別,那電腦怎麼知道是哪個 07/07 18:12
3F:→ optimist9266:然後要幫你自動完成哪個類別的方法呢? 07/07 18:12
我舉個例子好了:
public class abc
{
public int init=0;
public int show()
{
return init;
}
}
string typename = abc.GetType().AssemblyQualifiedName;
這個typename字串儲存在檔案裡
Type ObjType = Type.GetType(typename);
這樣我會拿回abc的type, 到這裡ObjType = abc.getType();
object tempObj = Activator.CreateInstance(ObjType);
這樣會把object tempObj轉換成abc
這時如果我想call abc裡的show() or init變數, 一般做法是:
abc tempabc = (abc)tempObj;
然後再:
tempabc.show() or tempabc.init
但實際上到這裡知道的資訊, 只有從檔案取出來的typename轉換成ObjType
光是Type變數, 沒辦法讓tempObj轉型去呼叫show()
※ 編輯: xanlich 來自: 118.168.21.72 (07/07 18:25)
4F:→ optimist9266:你的寫法好像跟 07/07 18:13
5F:→ optimist9266:StringBuilder sb = new StringBuilder(); 一樣... 07/07 18:14
6F:→ optimist9266:那何不寫個判斷式去判斷字串轉換成對應型別? 07/07 18:45
那樣就變苦工了呀 XD, 我有100個class變成要寫100條判斷式
所以我上來問, 有沒有辦法在只有Type變數的情況可以轉型, 謝謝~
※ 編輯: xanlich 來自: 118.168.21.72 (07/07 18:51)
7F:→ andymai:類別不同~方法相同嗎?如果相同是不是該弄個介面出來就好? 07/07 19:16
8F:→ andymai:如果不相同~那還是得寫判斷式才知道要呼叫什麼吧?或者~弄 07/07 19:17
9F:→ andymai:個介面的方法出來~每支都去實作自己的步驟就好了... 07/07 19:19
10F:推 liunate:轉型完之後你還是不能直接呼叫show(),用Reflection做吧 07/07 21:34