2011-03-31 62 views
15

我需要使用反射来动态创建一个C#类型。这是我的场景:我正在编写一个基类,它需要实例化某个对象作为其初始化的一部分。基类将不知道它应该实例化的对象的类型,但派生类将会。所以,我想让派生类在base()调用中将类型传递给基类。代码如下所示:如何使用反射动态实例化类型?

public abstract class MyBaseClass 
{ 
    protected MyBaseClass(Type myType) 
    { 
     // Instantiate object of type passed in 
     /* This is the part I'm trying to figure out */ 
    } 
} 

public class MyDerivedClass : MyBaseClass 
{ 
    public MyDerivedClass() : base(typeof(Whatever)) 
    { 
    } 
} 

换句话说,基类正在委托其派生类型选择要实例化的对象类型。

有人可以协助吗?

回答

42

尝试Activator.CreateInstance(Type)

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

+3

+1,不知道为什么这是倒票。平衡它。 – JaredPar 2011-03-31 00:16:55

+1

已接受,从我的+1 – 2011-03-31 00:48:05

+2

有点受限:“使用该类型的”default“构造函数创建指定类型的实例。”只有默认的构造函数。在构造过程中使用参数时,这可能更有用:使用最符合指定参数的构造函数创建指定类型的实例=> http://msdn.microsoft.com/en-us/library/4b0ww1we.aspx – 2013-08-26 09:02:58

17

您正在寻找Activator.CreateInstance

object instance = Activator.CreateInstance(myType); 

有此方法,可以采取构造函数参数或其他信息,找到类型的各种重载(如作为字符串形式的名称)

+0

谢谢,杰瑞德!我会接受斯图亚特的回答,因为他一分钟就把你击败了蜂鸣器。但是从我+1。 – 2011-03-31 00:15:20

+11

接受最好的答案,而不是第一个! :) – stusherwin 2011-03-31 00:20:01

13

您可能需要使用仿制药,而不是:

public abstract class MyBaseClass<T> where T : new() 
{ 
    protected MyBaseClass() 
    { 
     T myObj = new T(); 
     // Instantiate object of type passed in 
     /* This is the part I'm trying to figure out */ 
    } 
} 

public class MyDerivedClass : MyBaseClass<Whatever> 
{ 
    public MyDerivedClass() 
    { 
    } 
} 

where T : new()需要支持的new T()结构。

+0

这是一个很好的解决方案 - 我可能实际使用它来代替Activator.CreateInstance,这正是我试图记住的地方。从我+1。 – 2011-03-31 00:14:19