获取泛型抽象类的默认构造函数

时间:2010-08-20 07:11:40

标签: c# reflection reflection.emit

我有一个通用的抽象基类,我想从中通过reflection.emit构建一个动态类型。此外,我需要自定义派生类的默认构造函数来初始化一些字段。要正确构建派生类的默认构造函数,我需要获取基类的默认构造函数并调用它。问题是我无法从基类中获取默认构造函数。

一个例子:

public abstract class Test<T>
{
    private T data;

    public abstract void Go();
}

public class TestDerive : Test<int>
{
    public override void Go()
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        ConstructorInfo[] constructors = typeof(Test<>).GetConstructors();

        int length = constructors.Length;
    }
}

我已经尝试了一切,长度始终为零。我不明白。我在反射器中检查了类似的情况,确实调用了抽象类的基础构造函数。问题是如何让它做同样的事情?

1 个答案:

答案 0 :(得分:6)

抽象类的默认构造函数受到保护 - 您需要指定绑定标志以通过反射访问它。你可以使用

typeof(Test<>).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)

(当然,它在普通代码中是公共的还是受保护的,没有实际区别,因为你不能从派生类型中调用构造函数而不是。)

请注意,无论该类是否是通用的,都是这种情况 - 这是导致您出现问题的抽象性。