参考C#'动态'对象的动态成员

时间:2015-11-19 07:03:33

标签: c# dynamic json.net

我正在使用JSON.NET将JSON文件反序列化为C#中的dynamic对象。

在方法中,我想传入string并引用动态对象中的指定属性。

例如:

public void Update(string Key, string Value)
    {
        File.Key = Value;
    }

其中File是动态对象,Key是传入的字符串。假设我想传入键“foo”和值“bar”,我会做: Update("foo", "bar");,但由于dynamic对象类型的性质,导致

{
 "Key":"bar"
}

相反:

{
 "foo":"bar"
}

我可以用动态对象做我在这里问的问题吗?

3 个答案:

答案 0 :(得分:4)

怀疑你可以使用:

public void Update(string key, string Value)
{
    File[key] = Value;
}

这取决于动态对象如何实现索引,但如果这是一个Json.NET JObject或类似的,我希望它能够工作。重要的是要理解它不能保证适用于一般的dynamic表达式。

如果您实际上只需要这种操作(至少在课堂内),您可以考虑使用JObject作为字段类型,然后在需要时将其公开为dynamic

答案 1 :(得分:2)

好的,事实证明我很特别。以下是那些可能在未来偶然发现的人的答案,

事实证明你可以像使用数组索引那样使用键,它可以很好地工作。所以:

File[Key] = Value;以我需要的方式工作而不是 File.Key = Value;

非常感谢!

答案 2 :(得分:1)

如果您正在使用JSON.NET中的JObject,则可以执行此操作。它不适用于ExpandoObject

示例:

void Main()
{
    var j = new Newtonsoft.Json.Linq.JObject();
    var key = "myKey";
    var value = "Hello World!";
    j[key] = value;
    Console.WriteLine(j["myKey"]);
}

这个简单的例子打印了" Hello World!"正如所料。因此

var File = new Newtonsoft.Json.Linq.JObject();
public void Update(string key, string Value)
{
    File[key] = Value;
}

做你期望的事。如果您在上面的示例中声明File

dynamic File = new ExpandoObject();

您会收到运行时错误:

  

CS0021无法将[]索引应用于' ExpandoObject'

类型的表达式