Есть ли способ предоставить параметры конструктора для общих экземпляров? - PullRequest
3 голосов
/ 05 сентября 2010

Я не могу сделать это в C #:

    catch (Exception exception)
    {
        var wrappedException = new TException(exception);
    }

Получение ошибки "не может предоставить аргументы при создании экземпляра параметра типа" TException ". Просто хотел узнать у сообщества, есть ли способ сделать что-то подобное?

Ответы [ 2 ]

2 голосов
/ 05 сентября 2010

Самый простой (и лучший) метод - вызвать Activator.CreateInstance самостоятельно.Это то, что на самом деле делает компилятор C #, поскольку ограничение new() просто гарантирует, что указанный тип имеет конструктор без параметров;вызов new TException() на самом деле использует Activator.CreateInstance для создания экземпляра типа.

Примерно так будет работать:

throw (Exception)Activator.CreateInstance(typeof(TException), exception);
1 голос
/ 05 сентября 2010

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

void TheMethod<TException>(Func<Exception,TException> factory) {
  ...
  catch (Exception ex) {
    var wrapped = factory(ex);
    ...
  }
}

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

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