引用 C# 'dynamic' 对象的动态成员

Referring to dynamic members of C# 'dynamic' object

我正在使用 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"
}

是否可以使用动态对象执行我在这里提出的要求?

好吧,事实证明我很特别。以下是为将来可能遇到此问题的人提供的答案,

事实证明,您可以像使用数组索引一样使用键,而且效果很好。所以:

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

谢谢!

怀疑你可以使用:

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

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

如果您只是真正需要这种操作(至少在 class 内),您可以考虑使用 JObject 作为字段类型,然后将其公开为 dynamic 当你需要的时候。

如果您使用 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 Cannot apply indexing with [] to an expression of type 'ExpandoObject'