2013年11月19日 星期二

【C#】取得dynamic的屬性


解析Json格式時取得dynamic型別的物件,但如果裡面的物件不是用陣列的方式回傳,而是像這樣

我們不會知道.links底下究竟會link0、link1、link2....到幾,所以需要一個方法去try這個屬性是否存在
private object GetDynamicMember(object obj, string memberName)
{
 try
 {
     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);
 }
 catch (Exception ex)
 {
    return null;
 }           
}   

透過這個方法,我們就可以試著將屬性丟進去看看有無回傳值了
int i = 0;
while (true)
{
   dynamic trylink = GetDynamicMember(jsondata.links, "link" + i);
   if (trylink != null) 
   {
      _urlclickcount += Convert.ToInt32(trylink.clicks);
      i++;
   }
   else
      break;
}