我有一个JSON,它接受包含dotnet core的正文消息。我试着用各种形式写这篇文章(如:
[HttpPost]
public async Task<IActionResult> Create([FromBody] dynamic content)很难检索属性,并且不按名称返回属性。
[HttpPost]
public async Task<IActionResult> Create([FromBody] ExpandoObject content)也很难从其中检索属性,尽管可以使用["details"]检索顶级属性(尽管没有更深的内容)。
[HttpPost]
public async Task<IActionResult> Create([FromBody] JObject content)这样可以很容易地检索属性:
var firstName = content["contact"][0]["firstName"];
var accountName = content["generalDetails"]["accountName"];正在发送的正文消息类似于此,不会在格式上更改。
{
"details": {
"phone": 0123456789,
"email": "test@gmail.com",
"county": "BF"
},
"admin": {
"number": "gb12345"
},
"additional": {},
"contact": [
{
"firstName": "Jeff",
"lastName": "Bezos",
"title": "Mr."
},
{
"firstName": "Steve",
"lastName": "Jobs",
"title": "Mr."
}
]
}我希望使body参数动态(以某种形式),因为发送的实际正文内容非常大,并且包含比上面示例中的属性更多的属性。谨慎的做法是避免创建大型映射/DTO类,以防消息的设计在未来/进一步沿着开发路径发生变化。
是否有方法检索dynamic或ExpandoObject值的属性?
发布于 2022-04-05 12:05:59
免责声明:在处理C#和类型化语言时,创建类型总是比依赖动态之类的方法更好,它为您提供了语言设计的安全性和性能。
Is difficult to retrieve the properties and does not return the properties by name.
这正是dynamic的工作方式,因为类型未知,IDE提示和编译器本身无法告诉绑定到该类型的属性,因此它不会给您提供有关其属性的建议,但无论如何您都可以访问它们。
让我们假设您有以下类型:
public class MyType
{
public int MyInt { get; set; }
public string MyString { get; set; }
}然后你就知道了
dynamic myObj = new MyType();如果您键入myObj.,IDE将不显示任何属性,但是无论如何,您可以这样做,例如,Console.WriteLine(myObj.MyString),它不会出现问题。这里的要点是,您需要确切地知道变量名及其类型,因为如果您试图这样做
int myInt = myObj.MyInt + myObj.MyString;编译器将接受没有问题,但是在运行时会出现问题,因为只有在程序执行过程中才会发现类型。
如果您决定采用一种非类型化的方式来处理事情,我建议您使用dynamic而不是ExpandoObject和JObject,这样就会稍微轻一些。
https://stackoverflow.com/questions/71751213
复制相似问题