【问题标题】:How to instantiate a type dynamically using reflection?如何使用反射动态实例化类型?
【发布时间】:2016-12-09 01:11:05
【问题描述】:

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

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

有人可以帮忙吗?

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    试试Activator.CreateInstance(Type)

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

    【讨论】:

    • 有些限制:“使用该类型的 default 构造函数创建指定类型的实例。”只有默认构造函数。这在构造期间使用参数时可能更有用:使用与指定参数最匹配的构造函数创建指定类型的实例 => msdn.microsoft.com/en-us/library/4b0ww1we.aspx
    【解决方案2】:

    您正在寻找Activator.CreateInstance

    object instance = Activator.CreateInstance(myType);
    

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

    【讨论】:

    • 谢谢,杰瑞德!我会接受 Stuart 的回答,因为他领先你一分钟。但是我 +1。
    • 接受最佳答案,而不是第一个! :)
    【解决方案3】:

    您可能想改用泛型:

    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。来自我的 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多