private static PropertyReader[] GetDynamicProperties(IDynamicMetaObjectProvider provider)
        {
            var metaObject = provider.GetMetaObject(Expression.Constant(provider));

            var memberNames = metaObject.GetDynamicMemberNames();             // may return property names as well as method names, etc.

            var result = new List <PropertyReader>();

            foreach (var name in memberNames)
            {
                try
                {
                    var argumentInfo = new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) };

                    var binder = Binder.GetMember(CSharpBinderFlags.None, name, provider.GetType(), argumentInfo);

                    var site = CallSite <Func <CallSite, object, object> > .Create(binder);

                    var value = site.Target(site, provider);                     // will throw if no valid property getter

                    result.Add(new PropertyReader
                    {
                        Name          = name,
                        DeclaringType = provider.GetType(),
                        Read          = o => value
                    });
                }
                catch (RuntimeBinderException)
                {
                }
            }

            return(result.ToArray());
        }
Beispiel #2
0
        /// <summary>
        /// Creates the action for a dynamic object.
        /// </summary>
        /// <param name="provider">The dynamic object.</param>
        protected virtual Action <T> CreateActionForDynamic <T>(IDynamicMetaObjectProvider provider)
        {
            // http://stackoverflow.com/a/14011692/68499

            var type = provider.GetType();
            var parameterExpression = Expression.Parameter(typeof(T), "record");

            var metaObject  = provider.GetMetaObject(parameterExpression);
            var memberNames = metaObject.GetDynamicMemberNames();

            var delegates = new List <Action <T> >();

            foreach (var memberName in memberNames)
            {
                var getMemberBinder     = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, memberName, type, new[] { CSharpArgumentInfo.Create(0, null) });
                var getMemberMetaObject = metaObject.BindGetMember(getMemberBinder);
                var fieldExpression     = getMemberMetaObject.Expression;
                fieldExpression = Expression.Call(Expression.Constant(this), nameof(WriteField), new[] { typeof(object) }, fieldExpression);
                fieldExpression = Expression.Block(fieldExpression, Expression.Label(CallSiteBinder.UpdateLabel));
                var lambda = Expression.Lambda <Action <T> >(fieldExpression, parameterExpression);
                delegates.Add(lambda.Compile());
            }

            var action = CombineDelegates(delegates);

            return(action);
        }
Beispiel #3
0
        /// <summary>
        /// Creates a meta-object for the specified object.
        /// </summary>
        /// <param name="value">The object to get a meta-object for.</param>
        /// <param name="expression">The expression representing this <see cref="DynamicMetaObject"/> during the dynamic binding process.</param>
        /// <returns>
        /// If the given object implements <see cref="IDynamicMetaObjectProvider"/> and is not a remote object from outside the current AppDomain,
        /// returns the object's specific meta-object returned by <see cref="IDynamicMetaObjectProvider.GetMetaObject"/>. Otherwise a plain new meta-object
        /// with no restrictions is created and returned.
        /// </returns>
        public static DynamicMetaObject Create(object value, Expression expression)
        {
            ContractUtils.RequiresNotNull(expression, "expression");

            IDynamicMetaObjectProvider ido = value as IDynamicMetaObjectProvider;

#if !SILVERLIGHT && !MOBILE
            if (ido != null && !RemotingServices.IsObjectOutOfAppDomain(value))
            {
#else
            if (ido != null)
            {
#endif
                var idoMetaObject = ido.GetMetaObject(expression);

                if (idoMetaObject == null ||
                    !idoMetaObject.HasValue ||
                    idoMetaObject.Value == null ||
                    (object)idoMetaObject.Expression != (object)expression)
                {
                    throw Error.InvalidMetaObjectCreated(ido.GetType());
                }

                return(idoMetaObject);
            }
            else
            {
                return(new DynamicMetaObject(expression, BindingRestrictions.Empty, value));
            }
        }
    }
        /// <summary>
        /// Creates a meta-object for the specified object.
        /// </summary>
        /// <param name="value">The object to get a meta-object for.</param>
        /// <param name="expression">The expression representing this <see cref="DynamicMetaObject"/> during the dynamic binding process.</param>
        /// <returns>
        /// If the given object implements <see cref="IDynamicMetaObjectProvider"/> and is not a remote object from outside the current AppDomain,
        /// returns the object's specific meta-object returned by <see cref="IDynamicMetaObjectProvider.GetMetaObject"/>. Otherwise a plain new meta-object
        /// with no restrictions is created and returned.
        /// </returns>
        public static DynamicMetaObject Create(object value, Expression expression)
        {
            ContractUtils.RequiresNotNull(expression, "expression");

            IDynamicMetaObjectProvider ido = value as IDynamicMetaObjectProvider;

            if (ido != null)
            {
                var idoMetaObject = ido.GetMetaObject(expression);

                if (idoMetaObject == null ||
                    !idoMetaObject.HasValue ||
                    idoMetaObject.Value == null ||
                    (object)idoMetaObject.Expression != (object)expression)
                {
                    throw Error.InvalidMetaObjectCreated(ido.GetType());
                }

                return(idoMetaObject);
            }
            else
            {
                return(new DynamicMetaObject(expression, BindingRestrictions.Empty, value));
            }
        }
Beispiel #5
0
        static void SerializeDynamicObject(IDynamicMetaObjectProvider dyn, TextWriter stream, Options opts, int depth)
        {
            var quoteColon = "\":";

            if (opts.ShouldPrettyPrint)
            {
                quoteColon = "\": ";
            }

            stream.Write('{');
            depth++;

            var dynType = dyn.GetType();
            var metaObj = dyn.GetMetaObject(CachedParameterExp);

            var first = true;

            foreach (var memberName in metaObj.GetDynamicMemberNames())
            {
                var getter = GetGetMember(dynType, memberName);
                var val    = getter(dyn);

                if (val == null && opts.ShouldExcludeNulls)
                {
                    continue;
                }

                if (!first)
                {
                    stream.Write(',');
                }
                first = false;

                if (opts.ShouldPrettyPrint)
                {
                    LineBreakAndIndent(stream, depth);
                }

                stream.Write('"');
                stream.Write(memberName.JsonEscape(jsonp: opts.IsJSONP));
                stream.Write(quoteColon);

                Serialize(stream, val, opts, depth + 1);
            }

            depth--;
            if (opts.ShouldPrettyPrint)
            {
                LineBreakAndIndent(stream, depth);
            }

            stream.Write('}');
        }
Beispiel #6
0
        /// <summary>
        /// __dir__(self) -> Returns the list of members defined on a foreign IDynamicMetaObjectProvider.
        /// </summary>
        public static List DynamicDir(CodeContext /*!*/ context, IDynamicMetaObjectProvider self)
        {
            List res = new List(self.GetMetaObject(Expression.Parameter(typeof(object))).GetDynamicMemberNames());

            // add in the non-dynamic members from the dynamic objects base class.
            Type t = self.GetType();

            while (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(t))
            {
                t = t.GetBaseType();
            }

            res.extend(DynamicHelpers.GetPythonTypeFromType(t).GetMemberNames(context));

            res.sort(context);
            return(res);
        }
        public static DynamicMetaObject Create(object value, System.Linq.Expressions.Expression expression)
        {
            ContractUtils.RequiresNotNull(expression, "expression");
            IDynamicMetaObjectProvider provider = value as IDynamicMetaObjectProvider;

            if ((provider == null) || RemotingServices.IsObjectOutOfAppDomain(value))
            {
                return(new DynamicMetaObject(expression, BindingRestrictions.Empty, value));
            }
            DynamicMetaObject metaObject = provider.GetMetaObject(expression);

            if (((metaObject == null) || !metaObject.HasValue) || ((metaObject.Value == null) || (metaObject.Expression != expression)))
            {
                throw Error.InvalidMetaObjectCreated(provider.GetType());
            }
            return(metaObject);
        }
        public static GremlinVertex ToGremlinVertex(this IDynamicMetaObjectProvider obj)
        {
            Type scope = obj.GetType();
            ParameterExpression  param              = Expression.Parameter(scope);
            DynamicMetaObject    metaObject         = obj.GetMetaObject(param);
            IEnumerable <string> dynamicMemberNames = metaObject.GetDynamicMemberNames();

            string vertexLabel  = scope.Name;
            string id           = null;
            object partitionKey = null;
            List <Tuple <string, object> > vertexProperties = new List <Tuple <string, object> >();

            foreach (string memberName in dynamicMemberNames)
            {
                object value = ReadDynamicValue(obj, scope, metaObject, param, memberName);
                if (memberName.Equals("id", StringComparison.OrdinalIgnoreCase))
                {
                    id = value.ToString();
                }
                else if (memberName.Equals("partitionkey", StringComparison.OrdinalIgnoreCase))
                {
                    partitionKey = value;
                }
                else
                {
                    vertexProperties.Add(new Tuple <string, object>(memberName, value));
                }
            }

            if (id == null)
            {
                throw new MissingFieldException($"{vertexLabel} does not have expected property.", "id");
            }

            if (partitionKey == null)
            {
                throw new MissingFieldException($"{vertexLabel} does not have expected property.", "partitionKey");
            }

            return(BuildGremlinVertex(vertexLabel, id, partitionKey, vertexProperties));
        }
Beispiel #9
0
        /// <summary>
        /// Creates the action for a dynamic object.
        /// </summary>
        /// <param name="provider">The dynamic object.</param>
        protected virtual void CreateActionForDynamic(IDynamicMetaObjectProvider provider)
        {
            var type = provider.GetType();
            var parameterExpression = Expression.Parameter(typeof(object), "record");

            var metaObject    = provider.GetMetaObject(parameterExpression);
            var propertyNames = metaObject.GetDynamicMemberNames();

            var delegates = new List <Delegate>();

            foreach (var propertyName in propertyNames)
            {
                var getMemberBinder      = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, propertyName, type, new[] { CSharpArgumentInfo.Create(0, null) });
                var getMemberMetaObject  = metaObject.BindGetMember(getMemberBinder);
                var fieldExpression      = Expression.Block(Expression.Label(CallSiteBinder.UpdateLabel), getMemberMetaObject.Expression);
                var writeFieldMethodCall = Expression.Call(Expression.Constant(this), "WriteField", new[] { typeof(object) }, fieldExpression);
                var lambda = Expression.Lambda(writeFieldMethodCall, parameterExpression);
                delegates.Add(lambda.Compile());
            }

            typeActions[type] = CombineDelegates(delegates);
        }
Beispiel #10
0
        public override object Update(
            DataManager dataManager,
            string keyField,
            IDynamicMetaObjectProvider data,
            string tableName = null,
            Query query      = null,
            object original  = null)
        {
            IEnumerable <object> json = this.DataManager.Json;
            string str1 = (string)null;
            IDictionary <string, Type> columnType = DataUtil.GetColumnType((IEnumerable)json, false);
            Type type = data.GetType();
            bool flag = ((object)type != null ? type.BaseType : (Type)null) == typeof(DynamicObject);

            if (flag)
            {
                str1 = DataUtil.GetDynamicValue(data as DynamicObject, keyField).ToString();
            }
            else
            {
                IDictionary <string, object> dictionary = (IDictionary <string, object>)data;
                if (dictionary[keyField] != null)
                {
                    str1 = dictionary[keyField].ToString();
                }
            }
            foreach (object obj in (IEnumerable)json)
            {
                string str2 = (string)null;
                if (flag)
                {
                    str2 = DataUtil.GetDynamicValue(obj as DynamicObject, keyField).ToString();
                }
                else
                {
                    IDictionary <string, object> dictionary = (IDictionary <string, object>)obj;
                    if (dictionary[keyField] != null)
                    {
                        str2 = dictionary[keyField].ToString();
                    }
                }
                if (str2 == str1)
                {
                    if (flag)
                    {
                        foreach (string name in (data as DynamicObject).GetDynamicMemberNames().ToArray <string>())
                        {
                            if (name != keyField)
                            {
                                object dynamicValue1 = DataUtil.GetDynamicValue(data as DynamicObject, name);
                                object dynamicValue2 = DataUtil.GetDynamicValue(obj as DynamicObject, name);
                                if (dynamicValue1 != null && dynamicValue2 != null)
                                {
                                    (obj as DynamicObject).TrySetMember((SetMemberBinder) new DataSetMemberBinder(name, false), SfBaseUtils.ChangeType(dynamicValue1, dynamicValue2.GetType()));
                                }
                                else
                                {
                                    (obj as DynamicObject).TrySetMember((SetMemberBinder) new DataSetMemberBinder(name, false), dynamicValue1);
                                }
                            }
                        }
                    }
                    else
                    {
                        IDictionary <string, object> dictionary = (IDictionary <string, object>)data;
                        int           count = dictionary.Keys.Count;
                        List <string> list  = dictionary.Keys.ToList <string>();
                        for (int index = 0; index < count; ++index)
                        {
                            string key = list[index];
                            if (((IDictionary <string, object>)obj).ContainsKey(key))
                            {
                                if (dictionary[key] != null)
                                {
                                    Type conversionType = ((IDictionary <string, object>)obj)[key] != null ? ((IDictionary <string, object>)obj)[key].GetType() : columnType[key];
                                    if (conversionType == dictionary[key].GetType())
                                    {
                                        ((IDictionary <string, object>)obj)[key] = dictionary[key];
                                    }
                                    else
                                    {
                                        ((IDictionary <string, object>)obj)[key] = SfBaseUtils.ChangeType(dictionary[key], conversionType);
                                    }
                                }
                                else
                                {
                                    ((IDictionary <string, object>)obj)[key] = dictionary[key];
                                }
                            }
                            else
                            {
                                ((IDictionary <string, object>)obj).Add(key, dictionary[key]);
                            }
                        }
                    }
                    data = (IDynamicMetaObjectProvider)obj;
                }
            }
            return((object)data);
        }
Beispiel #11
0
        private static PropertyReader[] GetDynamicProperties(IDynamicMetaObjectProvider provider)
        {
            var metaObject = provider.GetMetaObject(Expression.Constant(provider));

            var memberNames = metaObject.GetDynamicMemberNames(); // may return property names as well as method names, etc.

            var result = new List<PropertyReader>();

            foreach (var name in memberNames)
            {
                try
                {
                    var argumentInfo = new[] {CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)};

                    var binder = Binder.GetMember(CSharpBinderFlags.None, name, provider.GetType(), argumentInfo);

                    var site = CallSite<Func<CallSite, object, object>>.Create(binder);

                    var value = site.Target(site, provider); // will throw if no valid property getter

                    result.Add(new PropertyReader
                    {
                        Name = name,
                        DeclaringType = provider.GetType(),
                        Read = o => value
                    });
                }
                catch (RuntimeBinderException)
                {
                }
            }

            return result.ToArray();
        }