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

30

我需要使用反射动态实例化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))
    {
    }
}

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

有人可以帮忙吗?

3个回答

71

2
有些受限:使用指定类型的“默认”构造函数创建一个实例。仅使用默认构造函数。在构建过程中使用参数可能更有用:使用最匹配指定参数的构造函数创建指定类型的实例 => http://msdn.microsoft.com/en-us/library/4b0ww1we.aspx - Mike de Klerk

25

谢谢,贾里德!我会接受斯图尔特的答案,因为他比你早一分钟按下了按钮。但是我会给你点赞。 - David Veeneman
14
接受最佳答案,而非第一个! :) - stusherwin

19
您可能希望使用泛型代替:
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()构造。


这是一个很棒的解决方案 - 我可能会用它来代替Activator.CreateInstance,这正是我试图记住的。我给你点赞。 - David Veeneman

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