【问题标题】:Is there a way to change property name afterwards? (c#)之后有没有办法更改属性名称? (C#)
【发布时间】:2017-12-26 02:53:13
【问题描述】:

例如,我正在尝试创建五个匿名对象以放入 List,但我想以不同的方式命名属性,这可能吗?'

List<dynamic> myObjects = new List<dynamic>();
for(int i=0;i<5;i++)
{
     //do this
    var obj = new { Prop+i = "some value" };

       //or
    obj."somehow change property name here";

    myObjects.Add(obj);
}

所以我的属性将被命名为:Prop0、Prop1、Prop2、Prop3、Prop4

【问题讨论】:

  • 我想,你想做一些奇怪的事情。你真正的任务是什么?为什么要这样做?
  • @Backs 例如this
  • 我认为,有一些更好的方法:使用字典,或者类继承

标签: c# properties anonymous-types


【解决方案1】:

正如 Backs 提到的 ExpandoObject 可以回答您的问题,通过将 ExpandoObject 转换为 IDictionary&lt;string, object&gt; 您可以将字典键视为属性名称:

List<dynamic> myObjects = new List<dynamic>();
for(int i=0;i<5;i++)
{
    dynamic obj = new ExpandoObject();
    //Add prop i property
    (obj as IDictionary<string, object>).Add("Prop"+i, "some value");
    //Remove prop i property
    (obj as IDictionary<string, object>).Remove("Prop"+i);
    //Add instead new property
    (obj as IDictionary<string, object>).Add("NewProp"+i, "some value");
    myObjects.Add(obj);
}

【讨论】:

  • 这是一个很好的解释,Backs 是对的,但我不明白他想说什么,这样做会不会出现性能问题?
  • @Yollo 许多许多性能问题。 dynamic 不是用于性能的类型
  • @Backs 谢谢你,你能告诉我有没有办法通过名字后缀来访问取笑属性?例如Console.WriteLine(obj["Prop"+i]); 我做不到。 (不能对“System.Dynamic.ExpandoObject”类型的表达式应用索引)
  • @Yollo 首先将其转换为 IDictionaryConsole.WriteLine(((IDictionary&lt;string, object&gt;)obj)["Prop"+i]);
【解决方案2】:

您可以使用ExpandoObject

List<dynamic> myObjects = new List<dynamic>();
for (int i = 0; i < 5; i++)
{

    dynamic obj = new ExpandoObject();
    obj.MyProperty = "some value";

    obj.ChangePropertyName = "change property name";

    myObjects.Add(obj);
}

但我不知道它是否对你有帮助:)

【讨论】:

  • 谢谢你的建议,我第一次听说ExpandoObjects,但是我可以做这样的事吗? obj.ChangePropertyName = "myChangedName"; Console.WriteLine(obj.myChangedName);
  • @Yollo 试试
  • 我在你的回答中得到的只是再创建一个属性。
  • @Yollo 如果你想删除属性,请检查:stackoverflow.com/questions/14491577/…
  • 谢谢,请查看我编辑的question
猜你喜欢
  • 1970-01-01
  • 2010-10-28
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多