使用保留字(类型名称)作为 ExpandoObject 或 Dynamic 属性

Sul*_*eyo 5 c# asp.net dynamic expandoobject elasticsearch

如何使用保留字的键设置 ExpandoObject 的属性?

像这样:

dynamic query = new ExpandoObject();
query.size = 10;
query.date = "2017-04-27";

dynamic match = new {
  query = query,
  bool = true
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*rov 5

ExpandoObject您可以通过将实例强制转换为使用任何字符串作为属性名称(包括保留字、空格等,甚至空字符串):ExpandoObjectIDictionary<string, object>

dynamic query = new ExpandoObject();
(query as IDictionary<string, object>)["bool"] = true;
(query as IDictionary<string, object>)[" b o o (g)? l \"e:)\""] = false;
(query as IDictionary<string, object>)[""] = true;
Run Code Online (Sandbox Code Playgroud)

您将无法使用“纯 C# 语法”(即obj.prop)访问此类属性。您必须将对象转换为IDictionary<string, object>并使用索引器访问它们:

var qDict = query as IDictionary<string, object>;
Console.WriteLine(qDict["bool"]);
Console.WriteLine(qDict[" b o o (g)? l \"e:)\""]);
Console.WriteLine(qDict[""]);
// Prints:
//   True
//   False
//   True
Run Code Online (Sandbox Code Playgroud)