C# 用变量实例化对象或对象列表

C# 用变量实例化对象或对象列表,c#,C#,让我们假设我有一个名为str的字符串,其值是类的名称。 e、 gstring str=“MyClass”是否有任何方法可以使用此变量稳定对象或对象列表 (这是因为我从一开始就不知道应该创建什么类型的对象,但在程序中的某个地方,我得到了一个带有类名称的字符串列表) 我真正想要的一些愚蠢的代码是: List<**str**> myList = new List<str>(); 先走一步 您可以使用反射,假设您的类位于同一程序集中: string input = "MyCla

让我们假设我有一个名为str的字符串,其值是类的名称。 e、 g
string str=“MyClass”是否有任何方法可以使用此变量稳定对象或对象列表

(这是因为我从一开始就不知道应该创建什么类型的对象,但在程序中的某个地方,我得到了一个带有类名称的字符串列表)

我真正想要的一些愚蠢的代码是:

List<**str**> myList = new List<str>();

先走一步

您可以使用反射,假设您的类位于同一程序集中:

string input = "MyClass";

var type = Assembly.GetExecutingAssembly()
                   .GetTypes()
                   .FirstOrDefault(t => t.Name == input);

MyClass myObject = (MyClass)Activator.CreateInstance(type);

您的代码可以基于以下内容,即以MyClass的名称构造MyClass的实例:

namespace MyNameSpace {

    public class MyClass {
        public MyClass() {
            // initialise
        }

        public static MyClass CreateMyClassFromName() {
            Type myType = Type.GetType("MyNameSpace.MyClass");
            System.Reflection.ConstructorInfo constinfo = myType.GetConstructor(new Type[] { });
            MyClass mc = (MyClass)constinfo.Invoke(null);
            return mc;
        }

    }

}

你几乎肯定不想这样做。这是可以做到的,但实际上永远不应该做到。有可能有更好的方法来解决真正的潜在问题。只需让您的对象实现接口或从基类继承,并将列表声明为list。感谢您的回答。但是在本例中(第3条语句),您必须再次显式写入类名,并使用类名(MyClass)强制转换好像你知道你必须使用什么类,但我不知道从开始的名字。我只在程序中间得到一个与类名相关的字符串。@ Cuangle:我们可以把第三个语句改成:动态MyObjult= Actudio.CreateInstance(type);因为动态类型就是为此而设计的。或者在这种情况下最好使用MyClass的基类。因为当我们预先知道类型时使用反射是没有意义的:基类myObject=Activator.CreateInstance(type)作为基类;
namespace MyNameSpace {

    public class MyClass {
        public MyClass() {
            // initialise
        }

        public static MyClass CreateMyClassFromName() {
            Type myType = Type.GetType("MyNameSpace.MyClass");
            System.Reflection.ConstructorInfo constinfo = myType.GetConstructor(new Type[] { });
            MyClass mc = (MyClass)constinfo.Invoke(null);
            return mc;
        }

    }

}