如何使用反射创建或调用抽象类的受保护构造函数?

时间:2013-04-17 08:26:53

标签: c#

我试图使用反射调用或创建抽象类的实例。这可能吗。这就是我尝试过的,但我得到一个错误说"无法创建抽象类的实例"。

Type dynType = myTypes.FirstOrDefault(a => a.Name == "MyAbstractClass");
ConstructorInfo getCons = 
dynType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null);
object dynamicInstance = getCons.Invoke(null);

编辑:我可以使用反射访问此抽象类的属性吗?

4 个答案:

答案 0 :(得分:2)

在抽象类上调用构造函数等同于尝试实例化抽象类,这是不可能的(您无法创建抽象类的实例)。

您需要做的是创建派生类的实例并声明其构造函数,以便它调用基础构造函数,如下所示:

public class DerivedClass : AbstractClass
{
    public DerivedClass() : base()
    {
        ....
    }
}

完整示例:

public abstract class Abstract
{
    public Abstract()
    {
        Console.WriteLine("Abstract");
    }
}

public class Derived : Abstract
{
    public Derived() : base()
    {
        Console.WriteLine("Derived");
    }
}

public class Class1
{
    public static void Main(string[] args)
    {
        Derived d = new Derived();
    }
}

这是

的输出
Abstract
Derived

答案 1 :(得分:0)

您无法实例化抽象类,甚至不能使用反射。

如果您需要实例,请:

  • 从班级中删除abstract修饰符。
  • 如果你不能这样做(例如,如果该类在一个封闭的库中),请定义一个继承自抽象类的子类并实例化该类。

答案 2 :(得分:0)

您无法创建abstract类的实例。但是,您可以使用继承并使用隐式转换

Derived derived = new Derived();
Abstract abstract = derived;

通过隐式转换,您可以将派生实例视为基类实例。

来自MSDN

The abstract modifier indicates that the thing being modified 
has a missing or incomplete implementation.

请参阅MSDN以获取参考。

答案 3 :(得分:0)

正如之前所有答案中已经提到的:它无法实例化抽象类。

另一个重要注意事项:通过反射实例化实例,你应该使用Activator.CreateInstance而不是构造函数调用。

object dynamicInstance = Activator.CreateInstance(yourType, yourArguments);

对象创建是一个比简单地调用构造函数更复杂的过程。它需要分配必要的内存量,然后通过调用构造函数来设置对象本身。