【问题标题】:JavaScript-like dynamic properties in C#C# 中类似 JavaScript 的动态属性
【发布时间】:2016-11-04 03:08:28
【问题描述】:

基本上,我在 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; }
}

我想回馈给客户的是这样的:

{
    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);
}

【问题讨论】:

标签: c# serialization asp.net-web-api


【解决方案1】:

您可以使用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 在 cmets 中所说,您还可以使用匿名对象:

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

【讨论】:

    【解决方案2】:

    这对于Dictionary 或任何关联数据结构来说听起来不错。您不需要花哨,您只需要一个映射,其中键是字符串(即字段名称),值是您想要的任何值。

    这种结构很容易转换为 JSON,反之亦然。

    Dictionary description

    查看此SO Thread,了解字典到 JSON 序列化的示例

    【讨论】:

    • 这就是我要说的,他的代码基本上是 var obj = new Dictionary { { "id", 1} }; obj["prop1"] = 100; obj["prop2"] = 200;
    • 我尝试扩展字典以实现扁平结构,但它以某种方式丢失了其余属性(例如 ID)MyObject: Dictionary&lt;string, int&gt;
    • 我不确定你的意思,但如果你试图将不同的“对象”组合到同一个字典中,是的,这些值将被覆盖。想想 JSON 如何处理集合;如果您尝试表示其中的几个,那么您有一个字典数组(即 javascript 对象)。
    猜你喜欢
    • 2010-10-07
    • 2011-05-05
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2011-07-13
    • 2016-08-25
    相关资源
    最近更新 更多