C#中类似JavaScript的动态属性

3
基本上,我需要C#中等价于以下JavaScript语法的代码:
var obj = {id: 1};
obj["prop1"] = 100;
obj["prop2"] = 200;

能否在WebAPI控制器操作中动态添加属性到C#对象并将其序列化为JSON?

我的C#对象:

public class MyObject
{
    public int Id { get; set; }
    public MyChildObject[] Chidren { get; set; }

    public int this[string prop]
    {
        get { return Chidren.Single(x => x.PropertyName == prop).Value; }
    }
}

public class MyChildObject
{
    public string PropertyName { get; set; }
    public int Value { get; set; }
}

我可以帮您翻译IT技术相关的内容。以下是您需要翻译的内容:

我想要向客户返回的内容是:

{
    id: 1,
    prop1: 100,
    prop2: 200
}

这个测试通过了,但显然只是因为属性在运行时被访问。然而,它们并没有被序列化:

[TestMethod]
public void CanAccessDymaicProperties()
{
    var dto = new MyObject
    {
        Id = 1,
        Chidren = new[]
        {
            new MyChildObject { PropertyName = "prop1",  Value = 100 },
            new MyChildObject { PropertyName = "prop2",  Value = 200 },

        }
    };

    Assert.AreEqual(dto["prop1"], 100);
    Assert.AreEqual(dto["prop2"], 200);
}

我知道答案可能是“不”,但我想探索一下我的选择。 - Ruslan
2
可能是Can I serialize an ExpandoObject in .NET 4?的重复问题。 - Eris
1
看一下ExpandoObject;https://msdn.microsoft.com/zh-cn/library/system.dynamic.expandoobject(v=vs.110).aspx - Dmitry Bychenko
2
除了下面给出的答案之外,您还可以使用匿名类型来做一些事情,就像这样 var x = new { id = 1, name= "Tom", numbers = new[] { 1,2,3} }; 这种对象可以作为Json从webapi返回,并在客户端的Javascript中使用。请参阅https://dev59.com/uGkw5IYBdhLWcg3wHW7n - derloopkat
2个回答

8
您可以使用一个 ExpandoObjectdynamic 关键字:
dynamic o = new ExpandoObject();
o.Prop1 = 100;
o.Prop2 = "Sample";
JsonConvert.SerializeObject(o); // {"Prop1":100,"Prop2":"Sample"}

如果您只需要序列化一组自定义的键/值对,您应该使用 Dictionary<string, object>

var dic = new Dictionary<string, object>();
dic["Prop1"] = 100;
dic["Prop2"] = "Sample";
JsonConvert.SerializeObject(dic); // {"Prop1":100,"Prop2":"Sample"}

正如@derloopkat在评论中所说,您也可以使用匿名对象:

var o = new { Prop1 = 100, Prop2 = "Sample" };
JsonConvert.SerializeObject(o);

3
这似乎是 Dictionary 或任何关联数据结构的好工作。您不需要变得花哨,只需使用键为字符串(即字段名称)且值为任何所需类型的映射即可。
这种结构可以轻松地转换为JSON格式,反之亦然。 Dictionary 描述 请查看此SO线程,以获取有关从 Dictionary 到 JSON 序列化的示例。

1
这就是我要说的,他的代码基本上是这样的: var obj = new Dictionary<string,int> { { "id", 1} }; obj["prop1"] = 100; obj["prop2"] = 200; - derloopkat
我尝试通过扩展字典来实现一个平面结构,但它不知何故丢失了其他属性(例如Id)MyObject: Dictionary<string, int> - Ruslan
我不太确定你的意思,但是如果你想将不同的“对象”合并到同一个字典中,是的,值会被覆盖。就像JSON处理集合一样,你可以有一个字典数组(即JavaScript对象),如果你想表示其中的几个。 - nlloyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接