从字符串变量中的类名创建一个类的对象实例

21

我不知道这是否可能,但我想知道是否可以,如果可以的话,如何操作。所以这是我的问题:

我有2-3个自定义模型类,例如CustomerEmployeeProduct。我还有一个类名称字符串。根据类名,我想创建一个实例并将其返回到视图中。如何实现呢?

我知道一种选项是使用if/else语句,但我想要一种更好的、更动态的方法。


你所需要的是反射,但通常来说,如果你使用反射,可能会出现一些问题(有些情况下确实需要使用反射,但并不常见)。 - Mike C.
4个回答

42

仅凭类名字符串并不足以创建其实例。事实上,您需要完整的命名空间,包括类名才能创建对象。

假设您有以下内容:

string className = "MyClass";
string namespaceName = "MyNamespace.MyInternalNamespace";

您可以通过以下两种技术之一创建该类的实例,即MyNamespace.MyInternalNamespace.MyClass的对象:

var myObj = Activator.CreateInstance(namespaceName, className);

或者这个:
var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className));

希望这能帮到您,如果有疑问请告诉我。

我有一个类名的字符串,基本上我不知道这个类的类型。那么我该如何创建特定类的对象呢?在"MyClass myObj ="中,我必须给出MyClass,但可能是任何类。 - Dhwani
我做了你试图要做的事情。正如我所提到的,除了类名之外,你还需要命名空间(作为字符串)。有了它们两个,你就可以按照我展示的方式创建该类的对象实例。我会编辑答案以澄清。谢谢你的提问。 - Display Name
4
那个最后的代码应该是这样写的:"var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className));" (漏了一个点吗?) - JCCyC
嘿,请帮帮我,我有同样的问题,但这个解决方案对我不起作用,请看这里 - SdSaati

9
    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();

这确实起作用了...
谢谢,Avi

2

最简单的方法是使用 Activator。将类名传递给 GetType 并创建新实例。

ClassInstance s1 = (ClassInstance)Activator.CreateInstance(Type.GetType("App.ClassInstance"));

public class ClassInstance
{
    public string StringData { get; set; }
}

敬礼,Nik


0

在 .net 中,Activator 类可以完成这项工作,这种技术对于依赖注入等场景非常有用。

string NameSpace = "ProjectName.YourNameSpace";
string ProbeClass = "CLassName";

ObjectHandle ProberHandle = Activator.CreateInstance(NameSpace, ProbeClass) as ObjectHandle;
ClassName Prober = ProberHandle.Unwrap() as ClassName;

确保在类型转换之前取消包装,否则会出现转换错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接