Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我有一个json主体,它有相似的参数,在3种不同的情况下有一个不同的参数,如何避免创建三个不同的主体_C#_Serialization_Jsonconvert - Fatal编程技术网

C# 我有一个json主体,它有相似的参数,在3种不同的情况下有一个不同的参数,如何避免创建三个不同的主体

C# 我有一个json主体,它有相似的参数,在3种不同的情况下有一个不同的参数,如何避免创建三个不同的主体,c#,serialization,jsonconvert,C#,Serialization,Jsonconvert,我有一个json主体,在3种不同的情况下有1个不同的属性 我尝试了一些自定义方法,但没有一种有效。这是我的jsonBody var postParameters = new CredoPayRequest() { amount = amount, birthDate = Dob, currency = "GEL", currencyRate = 1, depos

我有一个json主体,在3种不同的情况下有1个不同的属性

我尝试了一些自定义方法,但没有一种有效。这是我的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
        };
存款ID是指以不同方式存在的东西,有时是存款ID,有时是效用ID和贷款ID。我能做些什么来改变这个值,而不是创建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
    };

有两种解决方案。最简单的方法是创建所有三个属性并指定相应的属性:

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"
};

这可以防止对空属性进行无用的序列化(这可以通过各种方式避免,例如,请参见),但更重要的是,强制开发人员显式实例化他们想要发出的请求。没有犯错的余地。

“有时会是
存款ID
实用ID
贷款ID
”-这些类型是什么?您是否可以显示所有情况下的DTO和JSON?是否存在发送参数和仅将值设置为默认值的问题?是的。在一种特殊情况下,我必须拥有除loanId之外的所有参数,而在另一种情况下,必须拥有所有参数和utilityId,而不是loanId。我不能发送更多或更少的参数。我编辑了我的问题,你可以看到所有案例的主体。当你看到我的主体存款ID必须在utilityId中更改,如果有实用工具而不是存款。所以我想做的基本事情是,只在一个特定的属性上,而不是在整个身体上,做if statement或类似的东西。这在我回答的第二部分得到了解决。是的,但我仍然必须创建3个身体否?var request=new DepositRequest{这一个然后是var request=new UtilityreRequest,依此类推。“或者,您可以为每个请求创建一个类,继承自基本请求……但更重要的是,强制开发人员显式实例化他们想要发出的请求。没有出错的余地。”换言之:现在坚持Liskov的替换原则,以后你就省去了麻烦。避免了我无数次落入常见陷阱。有三个属性是不可取的,每个属性只在特定的上下文中使用。发生的情况是,你有一个类的实例,除非你知道是谁发送了它,为什么您不知道哪些已填充,哪些为空。创建实例的人也可能会感到困惑,不知道如果他们不填充某些属性会发生什么。如果您有三个单独的类(可能包括使用继承)这个问题消失了。dto的类型告诉您它是什么,并且它没有额外的属性。