Represents the invoke member dynamic operation at the call site, providing the binding semantic and the details about the operation.
상속: DynamicMetaObjectBinder
        private bool TryInvokeMemberWithNamedParameters(InvokeMemberBinder binder, object[] args, out object result,
                                                        MethodInfo method, ParameterInfo[] parameters)
        {
            var fixedArgs = new List<object>();
            for (int i = 0; i < parameters.Length; i++)
            {
                if (parameters[i].RawDefaultValue == DBNull.Value)
                {
                    fixedArgs.Add(args[i]);
                }
                else
                {
                    var index = binder.CallInfo.ArgumentNames.IndexOf(parameters[i].Name);
                    if (index > -1)
                    {
                        if (!parameters[i].ParameterType.IsInstanceOfType(args[index]))
                        {
                            result = null;
                            return false;
                        }
                    }
                    else
                    {
                        fixedArgs.Add(parameters[i].RawDefaultValue);
                    }
                }
            }

            result = method.Invoke(_adapter, fixedArgs.ToArray());
            return true;
        }
예제 #2
0
		/// <summary>
		/// Invokes the method specified and assigns the result to the result parameter. Returns
		/// true if a method to invoke was found and false otherwise.
		/// </summary>     
		public override bool TryInvokeMember( InvokeMemberBinder binder, object[] args, out object result )
		{
			var bindingFlags = Flags.InstanceAnyVisibility | Flags.IgnoreParameterModifiers;
			var method = target.GetType().Method( binder.Name, args.ToTypeArray(), bindingFlags );
			result = method == null ? null : method.Call( target, args );
			return method != null;
		}
예제 #3
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var name = binder.Name;
            result = GetUrl(name, args);

            return true;
        }
예제 #4
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var noArguments = args.Length == 0;
            if (noArguments)
            {
                var child = elementFactory.CreateElementWithNameForParent(binder.Name, element);
                element.AddChild(child);
                result = DynamicElementFor(child);
                return true;
            }

            var attributes = args.Cast<Attributes>();
            var argsAreAttributes = attributes.Any();
            if (argsAreAttributes)
            {
                var child = elementFactory.CreateElementWithNameForParent(binder.Name, element);
                element.AddChild(child);
                attributes.First().AddAttributesTo(child);

                result = DynamicElementFor(child);
                return true;
            }

            return base.TryInvokeMember(binder, args, out result);
        }
예제 #5
0
        private static Type GetGenericType(InvokeMemberBinder binder)
        {
            var csharpBinder = binder.GetType().GetInterface("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
            var typeArgs = (csharpBinder.GetProperty("TypeArguments").GetValue(binder, null) as IList<Type>);

            return typeArgs.FirstOrDefault();
        }
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if ("Evaluate" != binder.Name)
            {
                return base.TryInvokeMember(binder, args, out result);
            }

            if (!(args[0] is string))
            {
                throw new ArgumentException("No expression specified for parsing");
            }

            //args will contain expression and arguments,
            //ArgumentNames will contain only named arguments
            if (args.Length != binder.CallInfo.ArgumentNames.Count + 1)
            {
                throw new ArgumentException("Argument names missing.");
            }

            var arguments = new Dictionary<string, decimal>();

            for (int i = 0; i < binder.CallInfo.ArgumentNames.Count; i++)
            {
                if (IsNumeric(args[i + 1].GetType()))
                {
                    arguments.Add(binder.CallInfo.ArgumentNames[i], Convert.ToDecimal(args[i + 1]));
                }
            }

            result = Evaluate((string)args[0], arguments);

            return true;
        }
예제 #7
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var functionName = binder.Name;

            try
            {
                // convert arguments to Parameter
                var parameters = new Parameter[args.Length];

                for (int i = 0; i < args.Length; i++)
                {
                    parameters[i] = new Parameter(args[i]);
                }

                Function.SetEntRef(_entRef);
                result = Function.Call(functionName, typeof(object), parameters);

                return true;
            }
            catch (Exception ex)
            {
                Log.Error(ex);

                result = null;

                return false;
            }
        }
예제 #8
0
파일: Speech.cs 프로젝트: Laubeee/ecnf
 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
 {
     SpeechSynthesizer ss = new SpeechSynthesizer();
     ss.Speak(binder.Name);
     result = true;
     return true;
 }
예제 #9
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var handlesAttributes = GetType().GetCustomAttributes(typeof (HandlesAttribute), false).Cast<HandlesAttribute>();
            var attribute =
                (from attr in handlesAttributes
                 where string.Equals(attr.Method, binder.Name, StringComparison.OrdinalIgnoreCase)
                 select attr).FirstOrDefault();

            if (attribute != null)
            {
                var arguments = new object[] { endpoint, attribute.Method }.Concat(args);

                var genericType = typeof (UniversalRequestProvider<>)
                    .MakeGenericType(attribute.ParserType);

                result = Activator.CreateInstance(genericType, arguments.ToArray());

                return true;
            }

            ThrowHelper.Message(
                "The method '{1}' does not exist. The currently supported methods for {2} are:{0}{3}",
                Environment.NewLine, binder.Name, GetType().Name.Replace("Dynamic", ""),
                string.Join(Environment.NewLine, handlesAttributes.Select(x => @"    " + x.Method))
                );

            result = default(IRequestProvider);
            return false;
        }
예제 #10
0
        public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            if (dataStrategy is SimpleTransaction) return null;

            if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by"))
            {
                if (args.Length == 0) throw new ArgumentException("FindBy requires arguments.");
                if (args.Length == 1)
                {
                    if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument.");
                    if (args[0].GetType().Namespace == null) return null;
                }
            }

            var criteriaDictionary = CreateCriteriaDictionary(binder, args);
            if (criteriaDictionary == null) return null;

            var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteriaDictionary);
            try
            {
                var adapter = dataStrategy.GetAdapter();
                var func = adapter.OptimizingDelegateFactory.CreateFindOneDelegate(adapter, table.GetQualifiedName(), criteriaExpression);
                return a =>
                           {
                               var data = func(a);
                               return (data != null && data.Count > 0)
                                          ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy)
                                          : null;
                           };
            }
            catch (NotImplementedException)
            {
                return null;
            }
        }
예제 #11
0
파일: dtest-005.cs 프로젝트: nobled/mono
	public override bool TryInvokeMember (InvokeMemberBinder binder, object[] args, out object result)
	{
		Console.WriteLine ("Invoke");
		Invoke++;
		result = null;
		return true;
	}
예제 #12
0
        /// <summary>
        /// 实现 代理类的 调用方法的处理.
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="args"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryInvokeMember(
            InvokeMemberBinder binder, object[] args, out object result)
        {

            try
            {

                Console.WriteLine("### 调用{0}方法开始!", binder.Name);


                result = realObject.GetType().InvokeMember(
                    binder.Name,
                    BindingFlags.InvokeMethod,
                    null,
                    realObject,
                    args);

                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());                
                Console.WriteLine("### 调用{0}方法过程中发生了异常!", binder.Name);

                throw;
            }
            finally
            {
                Console.WriteLine("### 调用{0}方法结束!", binder.Name);
            }
        }
예제 #13
0
 public override bool TryInvokeMember(
     InvokeMemberBinder binder, object[] args, out object result)
 {
     if (cities.FindCity(binder.Name) != null) result = cities.FindCity(binder.Name);
     else result = "The city <" + binder.Name + "> does not exist!";
     return true;
 }
        public bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var adapterMethods = _adapter.GetType().GetMethods().Where(m => m.Name == binder.Name).ToList();

            foreach (var method in adapterMethods)
            {
                var parameters = method.GetParameters().ToArray();
                if (parameters.Any(p => p.RawDefaultValue != DBNull.Value) && binder.CallInfo.ArgumentNames.Any(s => !string.IsNullOrWhiteSpace(s)))
                {
                    if (TryInvokeMemberWithNamedParameters(binder, args, out result, method, parameters))
                    {
                        return true;
                    }
                }
                else
                {
                    if (AreCompatible(parameters, args))
                    {
                        result = method.Invoke(_adapter, args);
                        return true;
                    }
                }
            }

            result = null;
            return false;
        }
예제 #15
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            string routename = binder.Name;

            var stems = routename.Split('_');

            if (stems.Last() == "h")
            {
                routename = routename.Remove(binder.Name.Length - 2);

                result = GetAnchorTag("http", routename, args);
            }
            else if (stems.Last() == "s")
            {
                routename = routename.Remove(binder.Name.Length - 2);

                result = GetAnchorTag("https", routename, args);
            }
            else
            {
                result = GetAnchorTag(routename, args);
            }

            return true;
        }
예제 #16
0
        public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            if (dataStrategy is SimpleTransaction) return null;

            if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by"))
            {
                ArgumentHelper.CheckFindArgs(args, binder);
                if (args.Length == 1 && args[0].IsAnonymous()) return null;
            }

            var criteriaDictionary = ArgumentHelper.CreateCriteriaDictionary(binder, args, "FindBy", "find_by");
            if (criteriaDictionary == null) return null;

            var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteriaDictionary);
            try
            {
                var adapter = dataStrategy.GetAdapter();
                var func = adapter.OptimizingDelegateFactory.CreateFindOneDelegate(adapter, table.GetQualifiedName(), criteriaExpression);
                return a =>
                           {
                               var data = func(a);
                               return (data != null && data.Count > 0)
                                          ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy)
                                          : null;
                           };
            }
            catch (NotImplementedException)
            {
                return null;
            }
        }
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            result = null;

            if (binder.Name.Equals("element", StringComparison.InvariantCultureIgnoreCase))
            {
                if (args.Length != 2 && !(args[0] is string) && !(args[1] is string))
                    throw new ArgumentException("Method Element takes two string parameters.");

                result = ResolveElement((string)args[0], (string)args[1]);

                return ResolveResult(result);
            }

            if (binder.Name.Equals("attribute", StringComparison.InvariantCultureIgnoreCase))
            {
                if (args.Length != 1 && !(args[0] is string))
                    throw new ArgumentException("Method Attribute takes one string parameter.");

                if (XElements.Count() == 1)
                {
                    var xAttribute = XElements.Single().Attribute((string)args[0]);

                    if (xAttribute != null)
                        result = xAttribute.Value;
                }

                return ResolveResult(result);
            }

            return false;
        }
예제 #18
0
        public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            if (dataStrategy is SimpleTransaction) return null;

            var criteriaDictionary = CreateCriteriaDictionary(binder, args);
            if (criteriaDictionary == null) return null;

            var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteriaDictionary);
            try
            {
                var adapter = dataStrategy.GetAdapter();
                var func = adapter.OptimizingDelegateFactory.CreateFindOneDelegate(adapter, table.GetQualifiedName(), criteriaExpression);
                return a =>
                           {
                               var data = func(a);
                               return (data != null && data.Count > 0)
                                          ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy)
                                          : null;
                           };
            }
            catch (NotImplementedException)
            {
                return null;
            }
        }
예제 #19
0
 public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
 {
     var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), MethodNameParser.ParseFromBinder(binder, args));
     return new SimpleQuery(dataStrategy.Adapter, table.GetQualifiedName()).Where(criteria);
     //var data = dataStrategy.Find(table.GetQualifiedName(), criteria);
     //return CreateSimpleResultSet(table, dataStrategy, data);
 }
예제 #20
0
        internal static IEnumerable<KeyValuePair<string, object>> CreateCriteriaDictionary(InvokeMemberBinder binder, IList<object> args, params string[] exactNames)
        {
            IDictionary<string, object> criteriaDictionary = null;
            if (exactNames.Contains(binder.Name))
            {
                if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
                {
                    criteriaDictionary = binder.NamedArgumentsToDictionary(args);
                }
                else if (args.Count == 1)
                {
                    if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument.");
                    criteriaDictionary = args[0].ObjectToDictionary();
                }
            }
            else
            {
                criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args);
            }

            if (criteriaDictionary == null || criteriaDictionary.Count == 0)
            {
                throw new ArgumentException(binder.Name + " requires an equal number of column names and values to filter data by.");
            }
            return criteriaDictionary;
        }
예제 #21
0
 public override bool TryInvokeMember(InvokeMemberBinder binder,
     object[] args, out object result)
 {
     CreateElement(binder.Name, args);
     result = null;
     return true;
 }
예제 #22
0
파일: Logging.cs 프로젝트: stewmc/vixen
 // i.e. Error("I had an error.")
 // i.e. Error(exception)
 // i.e. Error("You can't do that.", exception)
 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
 {
     result = null;
     Log log;
     if (_logs.TryGetValue(binder.Name, out log)) {
         try {
             if (args.Length == 1) {
                 if (args[0] is string) {
                     log.Write(args[0] as string);
                     return true;
                 }
                 else if (args[0] is Exception) {
                     log.Write(args[0] as Exception);
                     return true;
                 }
             }
             else if (args.Length == 2) {
                 if (args[0] is string && args[1] is Exception) {
                     log.Write(args[0] as string, args[1] as Exception);
                     return true;
                 }
             }
             return false;
         }
         catch {
             return false;
         }
     }
     return base.TryInvokeMember(binder, args, out result);
 }
예제 #23
0
        public dynamic Invoke(DynamicViewPoint point, InvokeMemberBinder binder, object[] args)
        {
            string location = point.Location;

            string idValue = args.Length == 1 ? Convert.ToString(args[0]) : "";

            GetDataRequest request = new GetDataRequest
                {
                    Credentials = GetCredentials(),
                    Filter = new DataFilter
                        {
                            Location = location,
                            Criteria = new [] {new FilterEntry {Name = "Id", Value = idValue}},
                        },
                    View = new GetDataView
                        {
                            Module = point.AmplaModule
                        },
                    OutputOptions = new GetDataOutputOptions
                        {
                            ResolveIdentifiers = true
                        },
                };
            GetDataResponse response = WebServiceClient.GetData(request);

            List<dynamic> records = new List<dynamic>();
            IAmplaBinding binding = new AmplaGetDataBinding(response, records);
            if (binding.Validate() && binding.Bind())
            {
                return records.FirstOrDefault();
            }
            return null;
        }
예제 #24
0
파일: Composite.cs 프로젝트: rodpl/Orchard2
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if (args.Length == 0)
            {
                return TryGetMemberImpl(binder.Name, out result);
            }

            // method call with one argument will assign the property
            if (args.Length == 1)
            {
                result = this;
                return TrySetMemberImpl(binder.Name, args.First());
            }

            if (!base.TryInvokeMember(binder, args, out result))
            {
                if (binder.Name == "ToString")
                {
                    result = string.Empty;
                    return true;
                }

                return false;
            }

            return true;
        }
예제 #25
0
 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
 {
     var msg = new Message(binder, args);
     Apply(msg);
     result = null;
     return true;
 }
 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
 {
     if(Members.Contains(binder.Name))
         return base.TryInvokeMember(binder, args, out result);
     result = Evaluate(ConstructInvokeStatement(binder, args));
     return true;
 }
예제 #27
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            Object member = null;
            result = null;

            using (Proto.CreateContext(this))
            {
                var success = _members.TryGetValue(binder.Name, out member);

                if (success && member is Delegate)
                {
                    result = InvokeDelegate((Delegate)member, args);
                }

                if (!success)
                {
                    member = FindPrototypeMember(binder.Name, GetType());

                    if (member is Delegate)
                    {
                        result = InvokeDelegate((Delegate)member, args);
                        success = true;
                    }
                }

                return success;
            }
        }
예제 #28
0
파일: Api.cs 프로젝트: kingdango/ShopifyApi
        /// <summary>
        /// This builds a query with the passed in named arguments - shopify.Products(collection_id:121212)
        /// </summary>
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            var name = binder.Name.ToLower() + ".json";
            var url = _baseUrl + name;

            //params?
            var info = binder.CallInfo;
            var looper = 0;
            if (info.ArgumentNames.Count > 0) {

                for (int i = 0; i < args.Length; i++) {
                    var argName = info.ArgumentNames[i].ToLower();
                    var val = args[i];
                    //the ID is a singular call
                    //with a special format
                    if (argName == "id") {
                        url = url.Replace(".json", "/" + val + ".json");
                    } else {
                        if (looper == 0)
                            url += "?";
                        else
                            url += "&";
                        url += string.Format("{0}={1}", argName, val);
                    }
                    looper++;
                }
            }
            var json = Send(url);
            result = JsonHelper.Decode(json);
            return true;
        }
		/// <summary>
		/// Provides the implementation for operations that invoke a member. Classes
		/// derived from the System.Dynamic.DynamicObject class can override this method
		/// to specify dynamic behavior for operations such as calling a method.
		/// </summary>
		/// <param name="binder">
		/// Provides information about the dynamic operation. The binder.Name property
		/// provides the name of the member on which the dynamic operation is performed.
		/// For example, for the statement sampleObject.SampleMethod(100), where sampleObject
		/// is an instance of the class derived from the System.Dynamic.DynamicObject
		/// class, binder.Name returns "SampleMethod". The binder.IgnoreCase property
		/// specifies whether the member name is case-sensitive.
		/// </param>
		/// <param name="args">The arguments that are passed to the object member during the invoke operation.</param>
		/// <param name="result">The result of the member invocation.</param>
		/// <returns>true if the operation is successful; otherwise, false. </returns>
		public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
		{
			var methodName = binder.Name.ToLower();

			// Checking to see if an overload of write is called that is not supported.
			// all supported overloads should be explicitly implemented in this type. 
			if (methodName == "Write")
			{
				result = null;
				return false;
			}

			// All string.Concat does is to do a null check on the arg.
			var attributes = binder.CallInfo.ArgumentNames
								.Select((it, i) => new HtmlAttribute(RewriteAttributeName(it), string.Concat(args[i]))).ToArray();

			if (Array.IndexOf(SelfClosingTags, methodName) == -1)
			{
				result = new HtmlTag(this.writer, methodName, attributes);
			}
			else
			{
				result = null;
				this.writer.RenderSelfClosingTag(methodName, attributes);
			}

			return true;
		}
예제 #30
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            Console.WriteLine("TryInvokeMember is called,Name:{0}", binder.Name);
            bool tryResult = base.TryInvokeMember(binder, args, out result);

            return true;
        }
        /// <summary>
        /// Interpret a method call
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="args"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
        {
            var obj = new ElasticObject(binder.Name, null);

            AddElement(obj);
            result = obj;
            return(true);
        }
예제 #32
0
 /// <summary>
 /// Tries the invoke member.
 /// </summary>
 /// <param name="binder">The binder.</param>
 /// <param name="args">The args.</param>
 /// <param name="result">The result.</param>
 /// <returns></returns>
 public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
 {
     if (base.TryInvokeMember(binder, args, out result))
     {
         this.Recording.Add(new Invocation(InvocationKind.InvokeMemberUnknown, binder.Name, Util.NameArgsIfNecessary(binder.CallInfo, args)));
         return(true);
     }
     return(false);
 }
예제 #33
0
        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
        {
            var obj = new ElasticExpandoObject(null, this, binder.Name);

            this.elements.Add(obj);
            result = obj;
            return(true);

            //return base.TryInvokeMember(binder, args, out result);
        }
예제 #34
0
        // Needed for Visual basic dynamic support
        public override System.Dynamic.DynamicMetaObject BindInvokeMember(System.Dynamic.InvokeMemberBinder binder, System.Dynamic.DynamicMetaObject[] args)
        {
            var parameters = new System.Linq.Expressions.Expression[]
            {
                System.Linq.Expressions.Expression.Constant(binder.Name),
            };

            var callMethod = CallMethod(getValueMethod, parameters);

            return(callMethod);
        }
예제 #35
0
        /// <summary>
        /// Provides the implementation for operations that invoke a member. Classes derived from the <see cref="T:System.Dynamic.DynamicObject" /> class can override this method to specify dynamic behavior for operations such as calling a method.
        /// </summary>
        /// <param name="binder">Provides information about the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is an instance of the class derived from the <see cref="T:System.Dynamic.DynamicObject" /> class, binder.Name returns "SampleMethod". The binder.IgnoreCase property specifies whether the member name is case-sensitive.</param>
        /// <param name="args">The arguments that are passed to the object member during the invoke operation. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is derived from the <see cref="T:System.Dynamic.DynamicObject" /> class, first value in <paramref name="args" /> is equal to 100.</param>
        /// <param name="result">The result of the member invocation.</param>
        /// <returns>true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.)</returns>
        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
        {
            var obj = new ElasticObject(binder.Name, null);

            foreach (var a in args)
            {
                foreach (var p in a.GetType().GetProperties())
                {
                    this.AddAttribute(p.Name, p.GetValue(a, null));
                }
            }

            this.AddElement(obj);
            result = obj;
            return(true);
        }
예제 #36
0
 public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
 {
     if (binder.Name == "set" && binder.CallInfo.ArgumentCount == 2)
     {
         string name = string.Concat(args[0]);
         if (string.IsNullOrEmpty(name))
         {
             result = null;
             return(false);
         }
         object value = args[1];
         objMapping.TryAdd(name, value);
         result = value;
         return(true);
     }
     return(base.TryInvokeMember(binder, args, out result));
 }
예제 #37
0
 public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
 {
     if (binder.Name == "set" && binder.CallInfo.ArgumentCount == 2)
     {
         string name = args[0] as string;
         if (name == null)
         {
             //throw new ArgumentException("name");
             result = null;
             return(false);
         }
         object value = args[1];
         Properties.Add(name, value);
         result = value;
         return(true);
     }
     return(base.TryInvokeMember(binder, args, out result));
 }
예제 #38
0
        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
        {
            switch (binder.Name)
            {
            case "GetEnumerator":     // IEnumerable へのキャストと同様の理由。
                result = new[] { this }.GetEnumerator();
                return(true);

            case "All":     // All() 呼び出しで、子要素を全部取得できるようにする。
                result = element.Elements().Select(x => new DynamicXml(x)).ToList();
                return(true);

            case "Name":     // Name() で要素名を取得。
                result = element.Name.ToString();
                return(true);
            }

            return(base.TryInvokeMember(binder, args, out result));
        }
예제 #39
0
        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
        {
            string name = binder.Name;

            if (name == "AsEnumerable" && _element.ValueKind == JsonValueKind.Array)
            {
                var elements = new List <object>();

                foreach (JsonElement element in _element.EnumerateArray())
                {
                    elements.Add(GetResultFromElement(element));
                }

                result = elements;
                return(true);
            }

            result = null;
            return(false);
        }
예제 #40
0
 public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
 {
     //args[0] 为调用的属性名, args[1] 为默认值
     if (binder.Name.Equals("Get") && args != null && args.Length == 2)
     {
         if (args[0] != null && this.PrivateDic.ContainsKey(args[0].ToString()))
         {
             result = this.PrivateDic[args[0].ToString()];
         }
         else
         {
             result = args[1];
         }
         return(true);
     }
     else
     {
         return(base.TryInvokeMember(binder, args, out result));
     }
 }
예제 #41
0
        /// <summary>
        /// Interpret a method call
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="args"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
        {
            var obj = new ElasticObject(binder.Name, null);

            foreach (var a in args)
            {
#if NETFX_CORE
                foreach (var p in a.GetType().GetTypeInfo().DeclaredProperties)
                {
                    AddAttribute(p.Name, p.GetValue(a, null));
                }
#else
                foreach (var p in a.GetType().GetProperties())
                {
                    AddAttribute(p.Name, p.GetValue(a, null));
                }
#endif
            }

            AddElement(obj);
            result = obj;
            return(true);
        }
예제 #42
0
        /// <summary>
        /// Tries the invoke member.
        /// </summary>
        /// <param name="binder">The binder.</param>
        /// <param name="args">The args.</param>
        /// <param name="result">The result.</param>
        /// <returns></returns>
        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
        {
            if (!base.TryInvokeMember(binder, args, out result))
            {
                Type[] types = null;
                try
                {
                    IList <Type> typeList = Dynamic.InvokeGet(binder,
                                                              "Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder.TypeArguments");
                    if (typeList != null)
                    {
                        types = typeList.ToArray();
                    }
                }catch (RuntimeBinderException)
                {
                    types = null;
                }

                var name = InvokeMemberName.Create;
                result = InvokeStaticMethod(name(binder.Name, types), args);
            }
            return(true);
        }
예제 #43
0
        public virtual new System.Dynamic.DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, System.Dynamic.DynamicMetaObject[] args)
        {
            Contract.Requires(binder != null);

            return(default(System.Dynamic.DynamicMetaObject));
        }
예제 #44
0
        //public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object result) { throw new NotImplementedException(); }

        public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            throw new NotImplementedException();
        }
 //
 // Summary:
 //     Provides the implementation for operations that invoke a member. Classes derived
 //     from the System.Dynamic.DynamicObject class can override this method to specify
 //     dynamic behavior for operations such as calling a method.
 //
 // Parameters:
 //   binder:
 //     Provides information about the dynamic operation. The binder.Name property provides
 //     the name of the member on which the dynamic operation is performed. For example,
 //     for the statement sampleObject.SampleMethod(100), where sampleObject is an instance
 //     of the class derived from the System.Dynamic.DynamicObject class, binder.Name
 //     returns "SampleMethod". The binder.IgnoreCase property specifies whether the
 //     member name is case-sensitive.
 //
 //   args:
 //     The arguments that are passed to the object member during the invoke operation.
 //     For example, for the statement sampleObject.SampleMethod(100), where sampleObject
 //     is derived from the System.Dynamic.DynamicObject class, args[0] is equal to 100.
 //
 //   result:
 //     The result of the member invocation.
 //
 // Returns:
 //     true if the operation is successful; otherwise, false. If this method returns
 //     false, the run-time binder of the language determines the behavior. (In most
 //     cases, a language-specific run-time exception is thrown.)
 public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result);
예제 #46
0
 public virtual DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)
 {
     throw new NotImplementedException();
 }
예제 #47
0
 /// <summary>
 /// Tries the invoke member.
 /// </summary>
 /// <param name="binder">The binder.</param>
 /// <param name="args">The args.</param>
 /// <param name="result">The result.</param>
 /// <returns></returns>
 public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
 {
     return(RemoteInvoke(new Invocation(InvocationKind.InvokeMemberUnknown, binder.Name, Util.NameArgsIfNecessary(binder.CallInfo, args)), out result));
 }
예제 #48
0
 internal GetBinderAdapter(InvokeMemberBinder binder)
     : base(binder.Name, binder.IgnoreCase)
 {
 }
예제 #49
0
 /// <summary>
 /// Performs the binding of the dynamic invoke member operation.
 /// </summary>
 /// <param name="binder">An instance of the <see cref="InvokeMemberBinder"/> that represents the details of the dynamic operation.</param>
 /// <param name="args">An array of <see cref="DynamicMetaObject"/> instances - arguments to the invoke member operation.</param>
 /// <returns>The new <see cref="DynamicMetaObject"/> representing the result of the binding.</returns>
 public virtual DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)
 {
     ContractUtils.RequiresNotNull(binder, nameof(binder));
     return(binder.FallbackInvokeMember(this, args));
 }
예제 #50
0
 public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
 {
     result = null;
     return(false);
 }
        public virtual new bool TryInvokeMember(InvokeMemberBinder binder, Object[] args, out Object result)
        {
            result = default(Object);

            return(default(bool));
        }