4

我正在尝试使用反射调用或创建抽象类的实例。这可能吗。这是我尝试过的,但我收到一条错误消息“无法创建抽象类的实例”。

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

4 回答 4

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
于 2013-04-17T08:30:04.557 回答
0

正如之前所有答案中已经提到的:实例化抽象类是不可能的。

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

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

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

于 2013-04-17T08:42:29.283 回答
0

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

如果您需要一个实例,可以:

  • 从类中删除abstract修饰符。
  • 如果您不能这样做(例如,如果该类位于封闭库中),请定义一个从抽象类继承的子类并实例化该类。
于 2013-04-17T08:29:31.867 回答
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以获取参考。

于 2013-04-17T08:30:04.200 回答