创建一个匿名对象,其中字符串是属性名称

时间:2019-10-15 14:44:00

标签: c#

我想使用以下代码制作对象:

// eg "foo", "bar"
public void MakeObject(string field, string val){
  var update = new {
    field = val
  }

  ... do more things...
}

和我想要的结果对象将是:

{
 foo = "bar"
}

但我不断得到:

{
 field = "bar"
}

2 个答案:

答案 0 :(得分:2)

匿名类型只是您不键入自己的常规类型;当您这样做时:

new { field = val }

使用一个名为field(从string推论)的单个成员string val定义一个匿名类型。

您不能将匿名类型假装为具有不同成员名称的类型。

替代品:

  • 使用字典

    new Dictionary<string, string> { { field, val } }
    
  • 如果这是出于UI /数据绑定的目的,您可以使用TypeDescriptor API进行一些“有趣”的操作,以使其假装具有不同的名称(用于显示)。这是一个高级主题,但是如果涉及到我可以覆盖

  • 可能涉及dynamic

  • 的选项

这些选项对您的方案的工作情况如何真正取决于消耗对象的情况。对象序列化程序(JSON,XML等)可能与UI数据绑定控件的工作方式大不相同,而UI数据绑定控件的工作方式与ORM可能大不相同。那么:消费是什么?

答案 1 :(得分:1)

似乎您不是在寻找匿名对象,而是在寻找ExpandoObject(实际上是IDictionary<string, object>的实现),例如

  using System.Dynamic;

  ...

  dynamic myObject = new ExpandoObject();

  // Compile-time property
  myObject.foo = "abc";

  // Run-time property
  string propertyName = "bar";

  (myObject as IDictionary<string, object>).Add(propertyName, 123);

  Console.Write($"foo = {myObject.foo}; bar = {myObject.bar}");

结果:

  foo = abc; bar = 123