19

我不知道我要问的东西是否可用,但我只想知道它是否存在以及它是如何工作的。所以这是我的问题:

我有 2-3 个自己的自定义模型类。例如,客户、员工和产品。现在我在字符串中有类名。并且基于字符串中的类名,我必须创建它的对象并返回到一个视图。我怎么能做到这一点?

我知道一种IF ELSE陈述方式,但我想尝试一种更好的“动态”方式......

4

4 回答 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));

希望这会有所帮助,如果没有,请告诉我。

于 2013-03-16T18:17:09.433 回答
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();

这确实有效..

问候阿维

于 2013-09-25T12:58:35.177 回答
2

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

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

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

问候,尼克

于 2013-03-16T13:40:47.707 回答
0

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

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

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

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

于 2018-08-06T10:24:16.780 回答