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