繁体   English   中英

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

[英]How to create or invoke protected constructor of abstract class using reflection?

我试图使用反射调用或创建抽象类的实例。 这可能吗。 这是我尝试的方法,但是出现错误消息“无法创建抽象类的实例”。

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);

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

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

您需要做的是创建一个派生类的实例,并声明其构造函数,以便它按如下方式调用基本构造函数:

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

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

如果需要实例,请执行以下任一操作:

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

您不能创建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以获取参考。

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

另一个重要说明:通过反射实例化实例,您应该使用Activator.CreateInstance,而不要使用构造函数调用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM