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()); }
/// <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); }
/// <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)); } }
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('}'); }
/// <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)); }
/// <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); }
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); }
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(); }