Использование необязательного параметра в C # в качестве объекта

1

У меня есть этот код:

public IHttpActionResult Get([FromUri]GetFilesRequest request)

Если запрос имеет значение null, я хочу создать новый GetFilesRequest, потому что в конструкторе я сделал это, чтобы создать параметры по умолчанию для класса:

public GetFilesRequest()
    {
        Sort = "latest";
        Filter = "";
    }

Поэтому я думаю о:

public IHttpActionResult Get([FromUri]GetFilesRequest request = new GetFilesRequest)

Но я получаю это предупреждение:

'request' is of type 'GetFilesRequest'. A default parameter value of a reference type other than string can only be initialized with null.
Теги:
optional-arguments
optional-parameters

3 ответа

5

Нет - значение по умолчанию должно быть константой времени компиляции. Можете ли вы использовать перегрузку?

public IHttpActionResult Get()
{
     return Get(new GetFilesRequest());
}
  • 0
    Забудь об этом, я только что понял твой ответ. Большое спасибо!
4

Вы можете использовать только постоянное значение, которое может создать компилятор. То, что у вас есть, потребует распределения объектов времени исполнения, поэтому компилятор жалуется. Попробуйте что-то вроде этого.

public IHttpActionResult Get([FromUri]GetFilesRequest request = null) {
    request = request ?? new GetFilesRequest();
}
  • 0
    Да, я думал об этом. Но это не масштабируется. Представьте, что у меня есть 500 других методов GET, должен ли это делать каждый?
  • 0
    Ну, у вас есть 500 других методов получения? Я думаю, что вы могли бы написать пользовательское связующее для модели, чтобы создать новый экземпляр для каждого параметра.
2

Поскольку ошибка указывает, что это невозможно в качестве параметра. Однако вы можете реструктурировать код как таковой

public IHttpActionResult Get([FromUri]GetFilesRequest request = null)
{
   if (request == null) request = new GetFilesRequest();

   // TODO : Remaining method body
}
  • 0
    Да, я думал об этом. Но это не масштабируется. Представьте, что у меня есть 500 других методов GET, должен ли это делать каждый?
  • 0
    Я не совсем понимаю, как это не масштабируется? С точки зрения набора текста или с точки зрения производительности? Если это первое, код - это дополнительная строка, которая соответствует вашим ограничениям, будь то в сигнатуре метода или в теле - ее нужно записать. Если это потом, стоимость выполнения дополнительной нулевой проверки будет незначительной и не окажет заметного влияния на 500 методов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню