我不知道这是否可能,但我想知道是否可以,如果可以的话,如何操作。所以这是我的问题:
我有2-3个自定义模型类,例如Customer
、Employee
和Product
。我还有一个类名称字符串。根据类名,我想创建一个实例并将其返回到视图中。如何实现呢?
我知道一种选项是使用if/else
语句,但我想要一种更好的、更动态的方法。
我不知道这是否可能,但我想知道是否可以,如果可以的话,如何操作。所以这是我的问题:
我有2-3个自定义模型类,例如Customer
、Employee
和Product
。我还有一个类名称字符串。根据类名,我想创建一个实例并将其返回到视图中。如何实现呢?
我知道一种选项是使用if/else
语句,但我想要一种更好的、更动态的方法。
仅凭类名字符串并不足以创建其实例。事实上,您需要完整的命名空间,包括类名才能创建对象。
假设您有以下内容:
string className = "MyClass";
string namespaceName = "MyNamespace.MyInternalNamespace";
您可以通过以下两种技术之一创建该类的实例,即MyNamespace.MyInternalNamespace.MyClass
的对象:
var myObj = Activator.CreateInstance(namespaceName, className);
var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className));
string frmName = "frmCustomer";
//WorldCarUI. is the namespace of the form
Type CAType = Type.GetType("WorldCarUI." + frmName );
var myObj = Activator.CreateInstance(CAType);
Form nextForm2 = (Form)myObj;
nextForm2.Show();
最简单的方法是使用 Activator。将类名传递给 GetType 并创建新实例。
ClassInstance s1 = (ClassInstance)Activator.CreateInstance(Type.GetType("App.ClassInstance"));
public class ClassInstance
{
public string StringData { get; set; }
}
敬礼,Nik
在 .net 中,Activator 类可以完成这项工作,这种技术对于依赖注入等场景非常有用。
string NameSpace = "ProjectName.YourNameSpace";
string ProbeClass = "CLassName";
ObjectHandle ProberHandle = Activator.CreateInstance(NameSpace, ProbeClass) as ObjectHandle;
ClassName Prober = ProberHandle.Unwrap() as ClassName;
确保在类型转换之前取消包装,否则会出现转换错误。