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

时间:2013-03-16 13:23:10

标签: c# .net reflection runtime system.reflection

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

  

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

我知道IF ELSE声明的选项,但我想尝试更好的“动态”方式......

4 个答案:

答案 0 :(得分:41)

在string中使用类名不足以创建其实例。 事实上,您需要包含类名的完整命名空间来创建对象。

假设你有以下内容:

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

您可以使用以下任一技术创建该类的实例,即类MyNamespace.MyInternalNamespace.MyClass的对象:

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

或者这个:

var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className));

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

答案 1 :(得分: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 :(得分:2)

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

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

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

此致 NIK

答案 3 :(得分:0)

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

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

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

在键入强制类型转换之前,请确保展开,否则会出现转换错误。