我有一个端点:
http://localhost:5235/ProductsEF/GetSubstances/ApapExtra
我得到结果的地方,例如
/ApapExtra
:
{
"productId": 4,
"productName": "ApapExtra",
"substance1": "Paracetamolum",
"substance2": "Coffeinum",
"substance3": null,
"substance4": null
}
我还有另一个端点:
http://localhost:5235/SubstancesEF/GetSubstanceDataByName/Paracetamolum
我在哪里获取数据,例如
/Paracetamolum
:
{
"substanceId": 4,
"name": "Paracetamolum",
"effect": "Analgesic"
}
我想用一种方法将它们结合起来。我想创建一个方法:
[HttpGet("GetSubstances/{ProductName}")]
public Product GetSubstancesFromProduct(string ProductName)
{
Product product = _productRepository.GetProductDataByName(ProductName);
if (product == null)
{
throw new Exception("Could not find the product!");
}
List<Substance> substanceInfos = new List<Substance>();
// string[] substanceNames = new string[] { product.Substance1, product.Substance2, product.Substance3, product.Substance4 };
Console.WriteLine($"ProductName: {product.ProductName}");
return product;
}
这一行:
Product product = _productRepository.GetProductDataByName(ProductName);
通向第一个端点。我想要实现的逻辑:
所以我发送了请求
/ApapExtra
,我想得到:
{
"substanceId": 4,
"name": "Paracetamolum",
"effect": "Analgesic"
}
{
"substanceId": 4,
"name": "Coffeinum",
"effect": "Analgesic"
}
因为它由这些成分组成。
问题在于:
string[] substanceNames = new string[] { product.Substance1, product.Substance2, product.Substance3, product.Substance4 };
因为我得到:
可能的空引用分配。CS8601
即使我在模型中的字段名称旁边有
?
。
如何解决这个问题?或者如何更好的解决?
您尝试将可为空属性的内容存储到不可为空字符串的数组中 (
substanceNames
)。
由于您的空引用检查,编译器知道
product
不为 null,但理解 product.Substance1
、product.Substance2
、product.Substance3
和 product.Substance4
可以为 null,因为您已将它们声明为 nullable 模型中带有 ?
。
有多种方法可以解决此问题:
将
substanceNames
的类型更改为可空字符串数组,即 var substanceNames = new string?[] { product.Substance1, product.Substance2, product.Substance3, product.Substance4 };
或
如果物质属性/字段不能为空,请从模型中删除
?
,以便它们不可为空,或者
如果您确定它们为空,但您不更改模型,并且您希望在此特定场景中抑制有关这些属性/字段的所有可为空的警告,请使用
!
,null-forgiving,或空值抑制,运算符:var substanceNames = new string[] { product.Substance1!, product.Substance2!, product.Substance3!, product.Substance4! };