У меня есть тело json, которое имеет одинаковые параметры и отличается в трех разных ситуациях, как избежать создания трех разных тел - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть тело json с 1 другим свойством в 3 различных ситуациях

Я пробовал несколько пользовательских методов, но ни один из них не работал.Это мой jsonBody

var postParameters = new CredoPayRequest()
        {
            amount = amount,
            birthDate = Dob,
            currency = "GEL",
            currencyRate = 1,
            depositId = credoPayId,
            fee = 0,
            paymentDate = trx_date,
            personalNumber = personalNumber,
            terminalId = terminalId.ToString(),
            transactionId = invoiceID
        };

depositId - это то, что будет отличаться по-разному, иногда это будет depositId, иногда utilityId и loanId.Что я могу сделать, чтобы просто изменить это значение, а не создавать 3 разных тела?Мой класс

public class CredoPayRequest
{
    public string personalNumber { get; set; }
    public string transactionId { get; set; }
    public string terminalId { get; set; }
    public string paymentDate { get; set; }
    public string birthDate { get; set; }
    public string amount { get; set; }
    public int fee { get; set; }
    public string currency { get; set; }
    public int currencyRate { get; set; }
    public string accountId { get; set; }
    public string depositId { get; set; }
    public string utilityId { get; set; }

}

Утилита должна быть такой:

var postParameters = new CredoPayRequest()
    {
        amount = amount,
        birthDate = Dob,
        currency = "GEL",
        currencyRate = 1,
        utilityId = credoPayId,
        fee = 0,
        paymentDate = trx_date,
        personalNumber = personalNumber,
        terminalId = terminalId.ToString(),
        transactionId = invoiceID
    };

тогда учетные записи должны быть

var postParameters = new CredoPayRequest()
    {
        amount = amount,
        birthDate = Dob,
        currency = "GEL",
        currencyRate = 1,
        accountId = credoPayId,
        fee = 0,
        paymentDate = trx_date,
        personalNumber = personalNumber,
        terminalId = terminalId.ToString(),
        transactionId = invoiceID
    };

1 Ответ

1 голос
/ 11 апреля 2019

Есть несколько решений. Простейшим было бы создать все три свойства и назначить соответствующее:

public class CredoPayRequest
{
    // properties shared between all requests
    // ...
    public string depositId { get; set; }
    public string utilityId { get; set; }
    public string loanId { get; set; }
}

var request = new CredoPayRequest
{
    // assign shared properties
    // ...
    utilityId = "Foo"
};

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

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

public abstract class CredoPayRequest
{
    // properties shared between all requests
}

public class DepositRequest : CredoPayRequest
{   
    public string depositId { get; set; }
}

public class UtilityRequest : CredoPayRequest
{   
    public string utilityId { get; set; }
}

public class LoanRequest : CredoPayRequest
{   
    public string loanId { get; set; }
}

var request = new DepositRequest
{
    // assign shared properties
    // ...
    depositId = "Foo"
};

Это предотвращает бесполезную сериализацию пустых свойств (чего можно избежать различными способами, см., Например, NewtonSoft, добавьте JSONIGNORE в runTime ), но, что более важно, вынуждает разработчика явно создавать экземпляр запроса, который он хочет выдавать. Нет места для ошибок.

...