C#:如何在动态对象内部的数组中设置项的值? 对象结果=新建 { 项目=新[]{ 新的{name=“command”,index=“X”,optional=“0”}, 新建{name=“command”,index=“X”,optional=“0”} } };

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.' 结果变量的类型声明为对象 但分配给它的值是匿名

我想将第一项的name属性的值从“command”更改为“XYZ”

下面的方法不起作用。正确的方法是什么

result.GetType().GetProperties()[0].GetType().GetProperty("Name").SetValue(result,"XYZ")
错误:

System.ArgumentException: 'Property set method not found.'
  • 结果变量的类型声明为对象
  • 但分配给它的值是匿名类型
  • 所以结果变成了匿名类型&因此它的值不能被修改&和您将结果变量类型从object更改为var时得到的结果相同
  • &由于结果变量变为匿名类型,您将无法修改其属性值&因此错误在同一行上,即System.ArgumentException:“未找到属性集方法”

  • 简而言之,匿名类型属性是只读的,不能设置。但是,您可以将
    匿名类型
    转换为
    扩展对象

    自定义
    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";