protected override object DoEvaluate(ScriptThread thread) {
   thread.CurrentNode = this;  //standard prolog
   object result = null; 
   var leftValue = _left.Evaluate(thread);
   if (leftValue == null)
     thread.ThrowScriptError("Target object is null.");
   var type = leftValue.GetType();
   var members = type.GetMember(_memberName); 
   if (members == null || members.Length == 0)
     thread.ThrowScriptError("Member {0} not found in object of type {1}.", _memberName, type);
   var member = members[0];
   switch (member.MemberType) {
     case MemberTypes.Property:
       var propInfo = member as PropertyInfo;
       result = propInfo.GetValue(leftValue, null);
       break; 
     case MemberTypes.Field:
       var fieldInfo = member as FieldInfo;
       result = fieldInfo.GetValue(leftValue);
       break; 
     case MemberTypes.Method:
       result = new ClrMethodBindingTargetInfo(type, _memberName, leftValue); //this bindingInfo works as a call target
       break; 
     default:
       thread.ThrowScriptError("Invalid member type ({0}) for member {1} of type {2}.", member.MemberType, _memberName, type);
       result = null; 
       break; 
   }//switch
   thread.CurrentNode = Parent; //standard epilog
   return result; 
 }
Esempio n. 2
0
        protected override object DoEvaluate(ScriptThread thread)
        {
            thread.CurrentNode = this;  //standard prolog
            object result;
            var    leftValue = _left.Evaluate(thread);

            if (leftValue == null)
            {
                thread.ThrowScriptError("Target object is null.");
            }

            var type    = leftValue.GetType();
            var members = type.GetMember(_memberName);

            if (members.Length == 0)
            {
                thread.ThrowScriptError("Member {0} not found in object of type {1}.", _memberName, type);
            }

            var member = members[0];

            switch (member.MemberType)
            {
            case MemberTypes.Property:
                var propInfo = (PropertyInfo)member;
                result = propInfo.GetValue(leftValue, null);
                break;

            case MemberTypes.Field:
                var fieldInfo = (FieldInfo)member;
                result = fieldInfo.GetValue(leftValue);
                break;

            case MemberTypes.Method:
                result = new ClrMethodBindingTargetInfo(type, _memberName, leftValue);     //this bindingInfo works as a call target
                break;

            default:
                thread.ThrowScriptError("Invalid member type ({0}) for member {1} of type {2}.", member.MemberType, _memberName, type);
                result = null;
                break;
            }
            thread.CurrentNode = Parent; //standard epilog
            return(result);
        }