C#、.NET、检查将请求转换为字符串的函数中的空值
C#, .NET, Check for null in function which converts request to string
我有一个接受请求并将其转换为字符串的函数:
private string CreateEmailData(Models.V2.RequestPaymentModel data)
{
var emailRequest = new ApiRequest<RequestPaymentEmailModel>
{
Id = id,
DateUtc = DateTime.UtcNow,
Data = new Utils.EmailRequest.RequestPaymentEmailModel
{
LanguageCode = data.LanguageCode,
DeviceID = data.DeviceId,
CoreSystem = data.CoreSystem,
Transaction = new Utils.EmailRequest.TransactionEmail()
{
Country = data.CountryCode,
TransactionType = data.Transaction.Type,
Amount = data.Transaction.Amount,
Currency = data.Transaction.Currency,
Authorization = "",
Type = data.Transaction.Type,
Description = data.Transaction.Description,
PaymentNetwork = data.PaymentNetwork,
ReferenceId = data.Transaction.ReferenceID,
CartValue = data.Transaction.CartValue,
PaymentFrequency = data.Transaction.PaymentFrequency,
InvoiceNumber = data.Transaction.InvoiceNumber,
GoodsType = data.Transaction.GoodsType,
ProductID = data.Transaction.ProductId
},
CreditCard = new Utils.EmailRequest.EmailCreditCard()
{
Number = data.DataPaymentMethod.CreditCard.Number,
Month = data.DataPaymentMethod.CreditCard.Month,
Year = data.DataPaymentMethod.CreditCard.Year,
FirstName = data.DataPaymentMethod.CreditCard.FirstName,
LastName = data.DataPaymentMethod.CreditCard.LastName
},
PaymentMethod = data.PaymentMethod,
DataSecurity = data.DataSecurity,
ExtraParameter = data.DataPaymentMethod.ExtraParameter,
Buyer = data.DataPaymentMethod.Buyer,
Payer = data.DataPaymentMethod.Payer,
}
}.ToJson();
return emailRequest;
}
但有时 Payer
等请求中的某些值可能为空。
如何检查此函数中的空值?
现在,如果值为 null,它会使应用程序崩溃并且 returns:
$exception {"Object reference not set to an instance of an
object."} System.NullReferenceException
您可以使用将空值转换为字符串
这个例子意味着如果 Transaction 为 null,则使用 empty string 代替
TransactionType = data.Transaction?.Type ?? ""
这个例子意味着如果 CountryCode 为空,则使用 空字符串 代替
Country = data.CountryCode ?? ""
语法本身基本上是一个内联 if 语句,https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator
中还有更多内容
您需要包括空值检查。你的问题不是它不能转换成字符串。那是你在引用空对象。您需要做的是将您的代码替换为如下所示的行
Payer = data.DataPaymentMethod.Payer
重写成这样
Payer = data?.DataPaymentMethod?.Payer
这样,如果“数据”为空,则付款人为空。如果 data.DataPaymentMethod 为空,则付款人为空。最后,如果 data.DataPaymentMethod.Payer 为空,则 Payer 为空。如果您的 C# 版本支持此语法,那么这就是我要使用的。否则你要么需要编写一个丑陋的 turnary,要么创建一个方法来处理 null 检查。
我有一个接受请求并将其转换为字符串的函数:
private string CreateEmailData(Models.V2.RequestPaymentModel data)
{
var emailRequest = new ApiRequest<RequestPaymentEmailModel>
{
Id = id,
DateUtc = DateTime.UtcNow,
Data = new Utils.EmailRequest.RequestPaymentEmailModel
{
LanguageCode = data.LanguageCode,
DeviceID = data.DeviceId,
CoreSystem = data.CoreSystem,
Transaction = new Utils.EmailRequest.TransactionEmail()
{
Country = data.CountryCode,
TransactionType = data.Transaction.Type,
Amount = data.Transaction.Amount,
Currency = data.Transaction.Currency,
Authorization = "",
Type = data.Transaction.Type,
Description = data.Transaction.Description,
PaymentNetwork = data.PaymentNetwork,
ReferenceId = data.Transaction.ReferenceID,
CartValue = data.Transaction.CartValue,
PaymentFrequency = data.Transaction.PaymentFrequency,
InvoiceNumber = data.Transaction.InvoiceNumber,
GoodsType = data.Transaction.GoodsType,
ProductID = data.Transaction.ProductId
},
CreditCard = new Utils.EmailRequest.EmailCreditCard()
{
Number = data.DataPaymentMethod.CreditCard.Number,
Month = data.DataPaymentMethod.CreditCard.Month,
Year = data.DataPaymentMethod.CreditCard.Year,
FirstName = data.DataPaymentMethod.CreditCard.FirstName,
LastName = data.DataPaymentMethod.CreditCard.LastName
},
PaymentMethod = data.PaymentMethod,
DataSecurity = data.DataSecurity,
ExtraParameter = data.DataPaymentMethod.ExtraParameter,
Buyer = data.DataPaymentMethod.Buyer,
Payer = data.DataPaymentMethod.Payer,
}
}.ToJson();
return emailRequest;
}
但有时 Payer
等请求中的某些值可能为空。
如何检查此函数中的空值?
现在,如果值为 null,它会使应用程序崩溃并且 returns:
$exception {"Object reference not set to an instance of an object."} System.NullReferenceException
您可以使用将空值转换为字符串
这个例子意味着如果 Transaction 为 null,则使用 empty string 代替
TransactionType = data.Transaction?.Type ?? ""
这个例子意味着如果 CountryCode 为空,则使用 空字符串 代替
Country = data.CountryCode ?? ""
语法本身基本上是一个内联 if 语句,https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator
中还有更多内容您需要包括空值检查。你的问题不是它不能转换成字符串。那是你在引用空对象。您需要做的是将您的代码替换为如下所示的行
Payer = data.DataPaymentMethod.Payer
重写成这样
Payer = data?.DataPaymentMethod?.Payer
这样,如果“数据”为空,则付款人为空。如果 data.DataPaymentMethod 为空,则付款人为空。最后,如果 data.DataPaymentMethod.Payer 为空,则 Payer 为空。如果您的 C# 版本支持此语法,那么这就是我要使用的。否则你要么需要编写一个丑陋的 turnary,要么创建一个方法来处理 null 检查。