Activator.CreateInstance (строка) и Activator.CreateInstance <T>() разница - PullRequest
11 голосов
/ 11 сентября 2008

Нет, это не вопрос дженериков.

У меня есть шаблон Factory с несколькими классами с внутренними конструкторами (я не хочу, чтобы они создавались, если не через фабрику).

Моя проблема заключается в том, что CreateInstance завершается с ошибкой «Для этого объекта не определен конструктор без параметров, если я не передам« true »для непубличного параметра.

Пример

// Fails
Activator.CreateInstance(type);

// Works
Activator.CreateInstance(type, true);

Я хотел сделать фабрику универсальной, чтобы сделать ее немного проще, например:

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance<T>();
    }
}

Однако мне не удалось найти, как передать этот «истинный» параметр, чтобы он мог принимать непубличные конструкторы (внутренние).

Я что-то пропустил или это невозможно?

Ответы [ 3 ]

21 голосов
/ 11 сентября 2008

Чтобы обойти это, не могли бы вы просто изменить свое использование как таковое:

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance(typeof(T), true);
    }
}

Ваш фабричный метод все еще будет универсальным, но вызов активатора не будет использовать универсальную перегрузку. Но вы все равно должны достичь тех же результатов.

3 голосов
/ 11 сентября 2008

Если вам абсолютно необходимо, чтобы конструктор был закрытым, вы можете попробовать что-то вроде этого:

public abstract class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return (T)Activator.CreateInstance(typeof(T), true);
    }
}

В противном случае вам лучше добавить новое ограничение и перейти по этому маршруту:

public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
    public static T GetInstance()
    {
        return new T;
    }
}

Вы пытаетесь использовать GenericFactory в качестве базового класса для всех ваших фабрик вместо того, чтобы писать каждый с нуля, верно?

0 голосов
/ 13 июня 2010

помимо Activator.CreateInstance (typeof (T), true) для работы, T должен иметь конструктор по умолчанию

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