【问题标题】:C# Dynamic object has property with at symbolC# 动态对象具有带有 at 符号的属性
【发布时间】:2015-08-05 22:05:20
【问题描述】:

我的 elasticsearch 结果集中有一个对象; 我正在通过这个 foreach 重复这个:

foreach (Nest.IHit<dynamic> temp in result.Hits) {

}

一个temp它的源代码看起来像这样(在visual studio中右击并点击“复制值”)

{{
  "charSet": "UTF-8",
  "executionTime": 927,
  "parentUrl": "http://wfintranetdvlp.sidmar.be/sdg/",
  "@timestamp": "2015-08-05T13:50:40.721Z",
  "method": "GET",
  "contentLength": 31575,
  "mimeType": "text/html",
  "text": "You are here: Home Productie Productie Productie Sidgal Sidgal 1 Campagneplan Dagverslag PamBrowser Sidgal 2 Campagneplan Dagverslag PamBrowser Sidgal 3 Campagneplan Dagverslag PamBrowser Alle Lijnen Stilstanden Productierapporten Autonoom Onderhoud JAP AO-zones Uitgevoerde AO-activiteit afgelopen jaar Kalender audits AO",
  "title": "Productie",
  "url": "http://wfintranetdvlp.sidmar.be/sdg/productie-2/",
  "httpStatusCode": 200
}}

现在在我的代码中,我可以访问temp.Source.titletemp.Source.url 之类的参数,但是当我想访问@timestamp 时,它会返回null

知道如何访问时间戳吗?

【问题讨论】:

  • 我以为这是一个json
  • 请添加显示您如何访问这些属性的代码
  • 这不是 json 和 @MichalDymel 刚刚添加的 :)

标签: c#


【解决方案1】:

C# 标识符不能以@ 开头。您实际上是在尝试访问 timestamp - @ 被称为逐字说明符,它允许您使用关键字作为标识符,例如您可以有一个名为@this 的本地名称,它实际上是this 标识符。

唯一的方法是通过名称访问变量,例如yourvar["@timestamp"]

【讨论】:

    【解决方案2】:

    在为您尝试我的代码中的某些内容后,我发现了这个SO answer,因此删除了我的原始答案。

    答案中的相关代码是这样的:

    static object GetDynamicMember(object obj, string memberName)
    {
        var binder = Binder.GetMember(CSharpBinderFlags.None, memberName, obj.GetType(),
        new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) });
        var callsite = CallSite<Func<CallSite, object, object>>.Create(binder);
        return callsite.Target(callsite, obj);
    }
    

    它使用反射来建立调用以取回值,并且“@timestamp”可以很容易地作为字符串传入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多