C#动态对象具有符号

时间:2015-08-05 13:54:05

标签: c#

我的弹性搜索结果集中有一个对象; 我通过这个foreach迭代这个:

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

}

一个temp它的来源看起来像这样(只需在visual studio中右击并点击&#34;复制值&#34;)

{{
  "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

关于如何访问时间戳的任何想法?

2 个答案:

答案 0 :(得分: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”可以很容易地作为字符串传递。

答案 1 :(得分:2)

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

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