Получение конструктора по умолчанию для обобщенного абстрактного класса
У меня есть общий абстрактный базовый класс, из которого я хотел бы получить производный от динамического типа, созданного с помощью mirror.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 ответ
Конструктор по умолчанию для абстрактного класса защищен - вам нужно указать флаги привязки, чтобы получить к нему доступ через отражение. Ты можешь использовать
typeof(Test<>).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)
(Разумеется, нет никакой разницы, является ли он общедоступным или защищенным в обычном коде, поскольку нельзя вызывать конструктор, кроме как из производного типа.)
Обратите внимание, что это тот случай, является ли класс универсальным - именно абстрактность вызывает у вас проблемы.