Создать экземпляр унаследованного класса из конструктора абстрактного базового класса - PullRequest
0 голосов
/ 27 мая 2011

Используя отражение, возможно ли создать экземпляр типа, который наследуется от абстрактного базового класса, используя конструктор абстрактного базового класса?То есть без наследующего класса, имеющего собственный конструктор?Примерно как ниже, но выдает ошибку, потому что вы, конечно, не можете создать экземпляр абстрактного класса:

abstract class PersonBase
{
     string Name;

     public PersonBase(string _name) { Name = _name; }
}

class Person : PersonBase
{

}

public static T GetPerson<T>(string name) where T : PersonBase, new()
{
   ConstructorInfo info = typeof(T).BaseType.GetConstructor(new Type[] 
                                                              { typeof(string) });

   object result = info.Invoke(new object[] { name }); 

   return (T)result;    
}

Вы можете сделать эту работу, выполнив новый T {(назначить свойства здесь)}, ноКонечно, это не конструктор, и свойства должны быть открытыми и т. д.

1 Ответ

4 голосов
/ 27 мая 2011

Единственное место, где можно вызывать конструктор абстрактного класса - с помощью отражения или нет - находится внутри конструктора производного класса. Так что нет - как вы говорите, вы будете создавать экземпляр типа abstract вместо типа concrete . Представьте, если бы у абстрактного класса был абстрактный метод, и вы вызывали его для того, что возвращал конструктор - что бы это делало?

Если вы сможете дать нам больше информации о том, чего вы пытаетесь достичь, мы, возможно, сможем вам помочь больше.

(Ваш текущий пример даже не скомпилируется, поскольку конструктор по умолчанию Person не имеет конструктора базового класса без параметров.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...