作者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