我想使用以下代码制作对象:
// eg "foo", "bar"
public void MakeObject(string field, string val){
var update = new {
field = val
}
... do more things...
}
和我想要的结果对象将是:
{
foo = "bar"
}
但我不断得到:
{
field = "bar"
}
答案 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