首页 > 解决方案 > 创建一个匿名对象,该对象必须在键名中包含点并将其放在另一个匿名对象中

问题描述

我正在做JSON body一个elasticsearch查询。

我有这个dynamic

var hlBodyText = new
{
  bodyText = new { }
};

但是有一种情况下 name 必须是bodyText.exact = new { },但显然我不允许这样做并返回错误消息:

Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.

有一种方法可以使用dot char?

编辑

此外,我必须将此对象放在另一个对象中,如下所示:

var fieldsInner = new
{
  hlBodyText.bodyText
};

除了用点设置属性名称外,获得此结果的最佳方法是什么?

编辑#2

class我用我的所有参数创建了一个,因为我认为它JsonProperty attribute可以帮助我。

internal class ElasticSearchHighlightsModel
{
  [JsonProperty("bodyText")]
  public object bodyText { get; set; }
  [JsonProperty("title")]
  public object title { get; set; }
  [JsonProperty("shortDescription")]
  public object shortDescription { get; set; }

  [JsonProperty("bodyText.exact")]
  public object bodyTextExact { get; set; }
  [JsonProperty("title.exact")]
  public object titleExact { get; set; }
  [JsonProperty("shortDescription.exact")]
  public object shortDescriptionExact { get; set; }
}

然后在我的方法中,我有一个条件,我必须使用一些参数或其他参数。

// ...some code...
else
{
  var hlBodyText = new ElasticSearchHighlightsModel() { bodyTextExact = new { } };
  var hlTitle = new ElasticSearchHighlightsModel() { titleExact = new { } };
  var hlShortDescription = new ElasticSearchHighlightsModel() { shortDescriptionExact = new { } };

  var fieldsInner = new
  {
    hlBodyText.bodyTextExact,
    hlTitle.titleExact,
    hlShortDescription.shortDescriptionExact,
  };

  var fieldsContainer = new
  {
    pre_tags = preTags,
    post_tags = postTags,
    fields = fieldsInner,
  };
  return fieldsContainer;
}

但是该fieldsInner对象具有参数名称(bodyTextExact、titleExact 等...),而不是JsonProperty attribute那些。

标签: c#asp.net-mvcanonymous-typesanonymous-class

解决方案


看来这是您正在寻找的,稍后您将字典转换为 json

Dictionary<string,object> obj=new Dictionary<string,object>();

obj["bodyText.exact"]=new object{};

推荐阅读