C# 创建一个匿名对象,该对象必须在键名中包含点,并将其放入另一个匿名对象中

C# 创建一个匿名对象,该对象必须在键名中包含点,并将其放入另一个匿名对象中,c#,asp.net-mvc,anonymous-types,anonymous-class,C#,Asp.net Mvc,Anonymous Types,Anonymous Class,我正在为elasticsearch查询制作一个JSON主体 我有一个动态: var hlBodyText = new { bodyText = new { } }; 但有一种情况下,名称必须是bodyText.exact=new{},但显然不允许我这样做并返回错误消息: 无效的匿名类型成员声明符。匿名类型成员必须使用成员分配、简单名称或成员访问权限声明。 有一种方法可以使用点字符 编辑 此外,我必须把这个物体放在另一个物体里面,像这样: var fieldsInner = new {

我正在为
elasticsearch
查询制作一个
JSON主体

我有一个
动态

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

无效的匿名类型成员声明符。匿名类型成员必须使用成员分配、简单名称或成员访问权限声明。

有一种方法可以使用
点字符

编辑 此外,我必须把这个物体放在另一个物体里面,像这样:

var fieldsInner = new
{
  hlBodyText.bodyText
};
除了将属性名设置为点外,获得此结果的最佳方法是什么

编辑#2 我用所有参数创建了一个
,因为我认为
JsonProperty属性
可以帮助我

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属性的名称。

您似乎在寻找它,稍后将字典转换为json

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

obj["bodyText.exact"]=new object{};
Dictionary obj=newdictionary();
obj[“bodyText.exact”]=新对象{};

您似乎正在创建一个匿名类型(不是“动态”)并希望使用在C#中无效的其他名称对其进行序列化。为此,需要使用命名类型并使用 属性:

internal class HlBodyText 
{
    [JsonProperty("bodyText.exact")]
    public DateTime bodyText { get; set; }
}
并创建它的一个实例:

var hlBodyText = new HlBodyText() 
{
  bodyText = new { }
};

使用
字典解决,然后将其传递到
匿名类型obj

IDictionary highlitsFieldsContainer = new Dictionary<string, object>();
// ... some code
highlitsFieldsContainer["bodyText.exact"] = new { };
highlitsFieldsContainer["title.exact"] = new { };
var fieldsContainer = new
{
  fields = highlitsFieldsContainer,
};

// OUTPUT: fieldsContainer = { fields = { bodyText.exact = {}, title.exact = {} } }

如何将其转换为Json?我不转换它,这是我使用
Flurl
发送到
ES
的大型对象的一小部分,动态
不是一种类型。这是局部变量还是类属性?如果是属性,则可以使用@DStanley作为局部变量。也许创建一个具有属性的类会有所帮助这是个好主意,但对于我的情况来说,这可能还不够。我添加了一些关于问题的信息,但这些信息还不起作用
fieldsInner
对象没有
JsonParams属性
值,而是直接有
类参数
名称。
RouteValueDictionary _res = new RouteValueDictionary(dynamicResponse.highlights);
if (_res["shortDescription.exact"] != null)
{ 
  // ...
}