日期:2014-05-19  浏览次数:20586 次

如何动态实例化类?(马上给分)
我得到了一个字符串 "clsMyPart ",有一个类也叫clsMyPart,如何把字符串转为类啊
比如:
string   strClass   =   "ConvertTo ";
strClass   myClass   =   new   strClass();
这样写肯定是错的,我该怎么写?

-----------------------------------
搜了一下,好像需要反射
Type   type   =   Type.GetType( "Customnamespace.ConvertTo ",   true);
                object   newInstance   =   Activator.CreateInstance(type);
               
                string   a   =   newInstance.DateTimeType( "2007-02-01 ");
//DateTimeType是ConvertTo类下的一个方法;

运行报错:newInstance不包括DateTimeType的定义,也就是没有实例化成功;把string   a   =   newInstance.DateTimeType( "2007-02-01 ");屏蔽掉,调试,结果是:
----------------------
未能从程序集“App_Web_2pnyfszs,   Version=0.0.0.0,   Culture=neutral,   PublicKeyToken=null”中加载类型“Customnamespace.ConvertTo”。
----------------------
type为空,请问应该怎么写?

------解决方案--------------------
MethodInfo m = type.GetMethod( "DateTimeType "); m.Invoke(newInstance,参数
------解决方案--------------------
Type t = Type.GetType( "MyNamespace.clsMyPart ");
MyNamespace.clsMyPart s = (MyNamespace.clsMyPart)Activator.CreateIntance(t);
------解决方案--------------------
clsMyPart obj=(clsMyPart)Assembly.Load( "MyNamespace ").CreateInstance( "MyNamespace.clsMyPart ");
------解决方案--------------------
object newInstance = Activator.CreateInstance(type);

string a = newInstance.DateTimeType( "2007-02-01 ");
这句是有问题的,因为newinstance不过是个object,所以说你最好先做类型判断,然后用as转换过来,这样才能用啊,你现在的做法不就是一个object要有DataTimeType这个方法了

------解决方案--------------------
object a=assembly.load( "dll名 ").createinstance( "空间名.类名 ");
这样可以吗

个人见解,共同学习
------解决方案--------------------
object o = CreateStrClass(strClass );
private CreateStrClass(string className)
{
if (className= "strClass ")
return new strClass();
}

以上只是一种实现方式,如果你对设计模式熟悉的话,应该能看出这是一个典型的工厂模块.具体情况,还是需要你适当根据应用需求作修改.


PS:我感觉你的这部分代码设计有问题:1、我不知道为什么你把变量名和类名搞成一样;2、string本身也是一个类,3、对于反射的应用一定谨慎,因为那是以牺牲性能换来灵活性,反射还有一个问题就是类型的不安全性。