C#:如何在动态对象内部的数组中设置项的值? 对象结果=新建 { 项目=新[]{ 新的{name=“command”,index=“X”,optional=“0”}, 新建{name=“command”,index=“X”,optional=“0”} } };
我想将第一项的name属性的值从“command”更改为“XYZ” 下面的方法不起作用。正确的方法是什么C#:如何在动态对象内部的数组中设置项的值? 对象结果=新建 { 项目=新[]{ 新的{name=“command”,index=“X”,optional=“0”}, 新建{name=“command”,index=“X”,optional=“0”} } };,c#,.net,asp.net-core,object,C#,.net,Asp.net Core,Object,我想将第一项的name属性的值从“command”更改为“XYZ” 下面的方法不起作用。正确的方法是什么 result.GetType().GetProperties()[0].GetType().GetProperty("Name").SetValue(result,"XYZ") 错误: System.ArgumentException: 'Property set method not found.' 结果变量的类型声明为对象 但分配给它的值是匿名
result.GetType().GetProperties()[0].GetType().GetProperty("Name").SetValue(result,"XYZ")
错误:
System.ArgumentException: 'Property set method not found.'
简而言之,匿名类型属性是只读的,不能设置。但是,您可以将
匿名类型
转换为扩展对象
:
自定义ToExpando
方法:
public static class Extension
{
public static IEnumerable<dynamic> ToExpando(this IEnumerable<object> anonymousObject)
{
IList<dynamic> list = new List<dynamic>();
foreach (var item in anonymousObject)
{
IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(item);
IDictionary<string, object> expando = new ExpandoObject();
foreach (var nestedItem in anonymousDictionary)
expando.Add(nestedItem);
list.Add(expando);
}
return list.AsEnumerable();
}
}
调试您的代码并找出哪部分“不起作用”。该调用链中是否返回异常或
null
值?找出在哪里。修好它。再试一次。这是每个开发人员都要经历的调试过程的一部分。匿名类型属性是只读的,不能设置。创建强类型类,让编译器检查正确性,这样就不必了。在C#的最新版本中,您可以使用记录
来封装这样一个简单的类。如果你愿意的话,你甚至可以让它变。请注意,匿名类型虽然很容易动态声明,但在任何方面都不是“动态的”——它们有固定的结构,只是没有名称。简单的事实是:如果收到的类型具有无法设置的属性(例如匿名类型),则无法设置其属性。这也不在你的控制之下。您可能试图让一个不相关的用例工作——匿名类型不是ExpandoObject
s。
//change object to var...
var result = new
{
items = new[] {
new {name = "command" , index = "X", optional = "0"},
new {name = "command" , index = "X", optional = "0"}
}
};
var data = result.items.ToExpando().ToList();
//modify the value of name property
data.First().name = "XYZ";