如何使用反射动态实例化一个类型?

Dav*_*man 22 c# reflection

我需要使用反射动态地实例化一个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))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

stu*_*win 57

尝试 Activator.CreateInstance(Type)

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

  • +1,不知道为什么这会被低估.平衡了它. (3认同)
  • 有点限制:"使用该类型的`default`构造函数创建指定类型的实例." 只有默认构造函数.在构造期间使用参数时,这可能更有用:使用与指定参数最匹配的构造函数创建指定类型的实例=> http://msdn.microsoft.com/en-us/library/4b0ww1we.aspx (2认同)

Jar*_*Par 20

您正在寻找 Activator.CreateInstance

object instance = Activator.CreateInstance(myType);
Run Code Online (Sandbox Code Playgroud)

此方法有各种重载,可以使用构造函数参数或其他信息来查找类型(例如字符串形式的名称)

  • 接受最好的答案,而不是第一个!:) (11认同)

Kir*_*oll 16

您可能希望使用泛型:

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() 
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

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