Странный <T>Активатор Вопрос - PullRequest
0 голосов
/ 25 апреля 2010

Извините, но некоторое время назад я написал кусок кода, который был так хорош. И сейчас я пытаюсь вспомнить это для нового проекта.

Все, что я могу вспомнить, это то, что это выглядело примерно так:

public static Create<T>() *something missing here* : *Something missing here*
{
     // add methods etc here. I also think I remember something like " Activator.CreateInstance" being used. But I'm not sure.
}

Кто-нибудь писал такой код раньше? По сути, он создал элемент управления и передал его другому проекту.

Спасибо JT

Ответы [ 2 ]

1 голос
/ 25 апреля 2010

Вы можете указать условие для универсального типа. Если вы укажете, что он должен иметь конструктор, вам даже не нужен Activator для его вызова:

public static Create<T>() where T : new() {
  return new T();
}

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

1 голос
/ 25 апреля 2010

Вероятно, это выглядело примерно так:

public static Create<T>() where T : new()
{
    return Activator.CreateInstance(typeof(T));
}

Некоторые объяснения:

  • Activator.CreateInstance(typeof(T)) создает объект типа T.При желании вы можете передать параметры вызываемому конструктору (см. Справочную документацию для обзора параметров для Activator.CreateInstance), но, поскольку это должно работать почти для любого T, предоставление аргументов конструктора слишком специфично ине очень хорошая идея.

  • Вот почему where T : new() необходим.Это накладывает ограничение new() на параметр типа T.Это означает, что этот метод действителен только для типов T, которые предоставляют конструктор без параметров («по умолчанию»).


PS: Обратите внимание, что вам нужно только Activator.CreateInstance, когда все, что вам нужно работать, это System.Type.В приведенном выше примере у вас есть имя типа T, поэтому предпочтительным будет new T().Смотрите ответ @ Guffa для этого.

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