Упорядочение свойств в классах PowerShell с наследованием - PullRequest
0 голосов
/ 13 января 2020

При использовании классов PowerShell с наследованием, есть ли способ указать порядок параметров?

В приведенном ниже примере наследования есть два класса (HttpResponseOK и HttpResponseBadRequest), оба из которые наследуют другой класс (HttpResponse).

В этом случае создание экземпляров HttpResponseOK и HttpResponseBadRequest приводит к тому, что свойства этих объектов будут перечислены перед свойствами HttpResponse. Например -

Код

$HttpResponseOK = [HttpResponse]::OK("Everything is OK")
$HttpResponseOK | ConvertTo-Json

$HttpResponseBadRequest = [HttpResponse]::BadRequest("Something bad happened")
$HttpResponseBadRequest | ConvertTo-Json

Ответ

{
  "notification": "Everything is OK",
  "statusCode": 200
}

{
  "exception": "Something bad happened",
  "statusCode": 400
}

Как видно, при отправке ответа пользователю свойство statusCode появляется после notification / exception свойство. Учитывая, что notification / exception в действительности будут объектами, это означает, что statsCode изначально не виден в ответе.

Есть ли способ указать, что statusCode должно go до notification / exception?

Пример наследования

Class HttpResponse
{
    [int]$statusCode = [HttpStatusCode]::OK

    [void]SetStatus(
        [int]$statusCode
    )
    {
        $this.statusCode = $statusCode
    }

    static [HttpResponseOK]OK(
        [object]$notification
    )
    {
        $response = [HttpResponseOK]::new($notification)
        return $response
    }

    static [HttpResponseBadRequest]BadRequest(
        [object]$exception
    )
    {
        $response = [HttpResponseBadRequest]::new($exception)
        return $response
    }
}

Class HttpResponseOK : HttpResponse
{
    [object]$notification

    HttpResponseOK(
        [object]$notification
    )
    {
        $this.SetStatus([HttpStatusCode]::OK)
        $this.notification = $notification
    }
}

Class HttpResponseBadRequest : HttpResponse
{
    [object]$exception

    HttpResponseBadRequest(
        [object]$exception
    )
    {
        $this.SetStatus([HttpStatusCode]::BadRequest)
        $this.exception = $exception
    }
}

1 Ответ

0 голосов
/ 13 января 2020

Никогда не делал много с классами в Powershell, но если я переместу объявления для [object]$notification и [object]$exception в базовый класс HttpResponse, порядок, похоже, будет таким:

Class HttpResponse
{
    [int]$statusCode = [System.Net.HttpStatusCode]::OK
    [object]$notification
    [object]$exception

    [void]SetStatus(
        [int]$statusCode
    )
    {
        $this.statusCode = $statusCode
    }

    static [HttpResponseOK]OK(
        [object]$notification
    )
    {
        $response = [HttpResponseOK]::new($notification)
        return $response
    }

    static [HttpResponseBadRequest]BadRequest(
        [object]$exception
    )
    {
        $response = [HttpResponseBadRequest]::new($exception)
        return $response
    }
}

Class HttpResponseOK : HttpResponse
{
    HttpResponseOK(
        [object]$notification
    )
    {
        $this.SetStatus([System.Net.HttpStatusCode]::OK)
        $this.notification = $notification
    }
}

Class HttpResponseBadRequest : HttpResponse
{
    HttpResponseBadRequest(
        [object]$exception
    )
    {
        $this.SetStatus([System.Net.HttpStatusCode]::BadRequest)
        $this.exception = $exception
    }
}

$HttpResponseOK = [HttpResponse]::OK("Everything is OK")
$HttpResponseOK | ConvertTo-Json

$HttpResponseBadRequest = [HttpResponse]::BadRequest("Something bad happened")
$HttpResponseBadRequest | ConvertTo-Json

Вывод :

{
    "statusCode":  200,
    "notification":  "Everything is OK",
    "exception":  null
}
{
    "statusCode":  400,
    "notification":  null,
    "exception":  "Something bad happened"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...