参考:
http://www.codeproject.com/csharp/runtime_eval.asp应该可以实现你要的功能

解决方案 »

  1.   

    Type.GetType(ClassName).Assembly.CreateInstance(ClassName)
    返回值是一个object类型的值
      

  2.   

    using System;namespace 根据类名实例化类
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
    public void print ()
    {
    Console.WriteLine(" 你好呀!");
    }
    }
    class Cass2
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    Type myType1 = Type.GetType("根据类名实例化类.Class1");
    if(myType1.IsClass)
    {
    Class1 c = (Class1)Activator.CreateInstance(myType1);
    c.print();
    }
    }
    }
    }
      

  3.   

    楼上的兄弟,你的方法中还不是引用到类名了吗?
    Class1 c = (Class1)Activator.CreateInstance(myType1);关键是不知道Class1,也就是说在程序中不能出现Class1,只有一个字符串string strClassName = “Class1”;
      

  4.   

    补充:有个字符串:
     string strClassName;
     如果strClassName 是“Class1”则实例化一个Class1的对象,如果strClassName 是“Class2” 则实例化一个Class2的对象。而strClassName具体是什么,在程序设计时并不知道。
      

  5.   

    public class abc
    {
    public abc(string name)
    {
    ICodeCompiler compiler=new CSharpCodeProvider().CreateCompiler();
    CompilerParameters cp=new CompilerParameters();
    cp.ReferencedAssemblies.Add("system.dll");
    \\你可以在这里根据需要添加引用
    cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");
    cp.GenerateExecutable=false;
    cp.GenerateInMemory=true;
    StringBuilder str=new StringBuilder();
    str.Append("using System;\n");
    \\你可以在这里根据需要添加引用
    str.Append("using System.Windows.Forms;\n");
    str.Append("namespace abc {\n");
    str.Append("public class control1:"+name+" {\n");
    str.Append("}}");
    CompilerResults result=compiler.CompileAssemblyFromSource(cp,str.ToString());
    if (result.Errors.HasErrors)
    {
    string s="";
    for (int i=0;i<result.Errors.Count;i++)
    {
    s+=result.Errors[i].ErrorText+"\n";
    }
     throw new Exception("Error Compiling Expression: " + s);
    }
    Assembly assembly=result.CompiledAssembly;
    o=assembly.CreateInstance("abc.control1");
    }
    public static object GetObjectByName(string name)
    {
    abc abc1= new abc(name);
    return abc1.o;
    }
    public object o=null;
    }如果你要求实例化的类都在System和System.Windows.Forms名称空间下的话,你可以直接使用上面的类,需要其他的名称空间,自己添加 :)
    使用:
    Label o=(Label)abc.GetObjectByName("Label");
    o.Parent=this;
    o.Left=10;
    o.Top=10;
    o.Text="abc";
    o.Height=20;
    o.Width=40;
      

  6.   

    dy_2000_abc(芝麻开门)兄按楼主的说法好像(Label)abc.GetObjectByName("Label");和我说那个差不多吧!(Label)这儿不是也引用了它说的那个类了呀!
      

  7.   

    GetType(string typename)在使用上存在限制。传入的参数如果不是完全限定的类型名称,那么方法只在调用对象程序集和mscorlib.dll程序集中进行搜索。一个解决的办法是假设所有传递的类名称在特定的几个名字空间之一中被定义(列举5,6个名字空间很容易),具体做法就像上面的例子。另外,snewxf(心疤)提醒的对,我没看清楼主的要求。可楼主的要求好像不太合理,因为如果预先不知道实例的类型,在程序中是无法为特定的类编写代码的。如果需要调用编译时不知类型的实例的方法或成员,可以使用 Type.InvokeMember 可调用类型的成员。
      

  8.   

    高手救我!依chenbinghui(阿炳) 所述,我在程序中作如下调用:String sRptClassName = "RptWorkSheetType" + "1";ReportClass oRpt = (ReportClass)Type.GetType(sRptClassName).Assembly.CreateInstance(sRptClassName);执行时出现如下错误:
    未处理的"System.NullReferenceException"类型异常出现在InspectionManager.exe中
    其他信息:Object reference not set to an instance of an object.但若将程序改为ReportClass oRpt = new RptWorkSheetType1();
    则执行正常。苦恼!
    为何?
      

  9.   

    因为Type.GetType(sRptClassName)返回的是null值,上面提到:GetType(string typename)在使用上存在限制。传入的参数如果不是完全限定的类型名称,那么方法只在调用对象程序集和mscorlib.dll程序集中进行搜索。有两种方法可以解决,第一,使用完全限定名,第二,使用上面那个abc类
      

  10.   

    同意 "nullhue(一个人去旅行)" 的话,像这种情况建议使用工厂模式。