Пример #1
0
        public override DynamicMetaObject BindGetMember(GetMemberBinder binder) {
            ComBinder.ComGetMemberBinder comBinder = binder as ComBinder.ComGetMemberBinder;
            bool canReturnCallables = comBinder == null ? false : comBinder._CanReturnCallables;

            ContractUtils.RequiresNotNull(binder, "binder");

            ComMethodDesc method;
            ComEventDesc @event;

            // 1. Try methods
            if (_self.TryGetMemberMethod(binder.Name, out method)) {
                return BindGetMember(method, canReturnCallables);
            }

            // 2. Try events
            if (_self.TryGetMemberEvent(binder.Name, out @event)) {
                return BindEvent(@event);
            }

            // 3. Try methods explicitly by name
            if (_self.TryGetMemberMethodExplicit(binder.Name, out method)) {
                return BindGetMember(method, canReturnCallables);

            }

            // 4. Fallback
            return base.BindGetMember(binder);
        }
Пример #2
0
        public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result, bool delayInvocation) {
            ContractUtils.RequiresNotNull(binder, "binder");
            ContractUtils.RequiresNotNull(instance, "instance");

            if (TryGetMetaObject(ref instance)) {
                //
                // Demand Full Trust to proceed with the binding.
                //

                new PermissionSet(PermissionState.Unrestricted).Demand();

                var comGetMember = new ComGetMemberBinder(binder, delayInvocation);
                result = instance.BindGetMember(comGetMember);
                if (result.Expression.Type.IsValueType) {
                    result = new DynamicMetaObject(
                        Expression.Convert(result.Expression, typeof(object)),
                        result.Restrictions
                    );
                }
                return true;
            } else {
                result = null;
                return false;
            }
        }
Пример #3
0
        public static DynamicMetaObject TryBind(RubyContext/*!*/ context, GetMemberBinder/*!*/ binder, DynamicMetaObject/*!*/ target) {
            Assert.NotNull(context, target);
            var metaBuilder = new MetaObjectBuilder();
            var contextExpression = AstUtils.Constant(context);

            RubyClass targetClass = context.GetImmediateClassOf(target.Value);
            MethodResolutionResult method;
            RubyMemberInfo methodMissing = null;

            using (targetClass.Context.ClassHierarchyLocker()) {
                metaBuilder.AddTargetTypeTest(target.Value, targetClass, target.Expression, context, contextExpression);

                method = targetClass.ResolveMethodForSiteNoLock(binder.Name, RubyClass.IgnoreVisibility);
                if (method.Found) {
                    methodMissing = targetClass.ResolveMethodForSiteNoLock(Symbols.MethodMissing, RubyClass.IgnoreVisibility).Info;
                }
            }
            
            if (method.Found) {
                // we need to create a bound member:
                metaBuilder.Result = AstUtils.Constant(new RubyMethod(target.Value, method.Info, binder.Name));
            } else {
                // TODO:
                // We need to throw an exception if we don't find method_missing so that our version update optimization works: 
                // This limits interop with other languages. 
                //                   
                // class B           CLR type with method 'foo'
                // class C < B       Ruby class
                // x = C.new
                //
                // 1. x.GET("foo") from Ruby
                //    No method found or CLR method found -> fallback to Python
                //    Python might see its method foo or might just fallback to .NET, 
                //    in any case it will add rule [1] with restriction on type of C w/o Ruby version check.
                // 2. B.define_method("foo") 
                //    This doesn't update C due to the optimization (there is no overridden method foo in C).
                // 3. x.GET("foo") from Ruby
                //    This will not invoke the binder since the rule [1] is still valid.
                //
                object symbol = SymbolTable.StringToId(binder.Name);
                RubyCallAction.BindToMethodMissing(metaBuilder, 
                    new CallArguments(
                        new DynamicMetaObject(contextExpression, BindingRestrictions.Empty, context),
                        new[] { 
                            target,
                            new DynamicMetaObject(AstUtils.Constant(symbol), BindingRestrictions.Empty, symbol) 
                        },
                        RubyCallSignature.Simple(1)
                    ),
                    binder.Name,
                    methodMissing,
                    method.IncompatibleVisibility,
                    false
                );
            }

            // TODO: we should return null if we fail, we need to throw exception for now:
            return metaBuilder.CreateMetaObject(binder, DynamicMetaObject.EmptyMetaObjects);
        }
Пример #4
0
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                if (storage.ContainsKey(binder.Name))
                {
                    result = storage[binder.Name];
                    return true;
                }

                result = null;
                return false;
            }
Пример #5
0
            // Returns the name of the property back as the result, but is a stickler for .NET naming
            // conventions and returns false if the first character isn't uppercase
            // (Correct handling of Unicode category Lt omitted)
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                string name = binder.Name;
                if (char.IsUpper(name[0]))
                {
                    result = binder.Name;
                    return true;
                }

                result = null;
                return false;
            }
Пример #6
0
        public static MetaObject TryBind(RubyContext/*!*/ context, GetMemberBinder/*!*/ binder, MetaObject/*!*/ target) {
            Assert.NotNull(context, target);
            var metaBuilder = new MetaObjectBuilder();
            var contextExpression = Ast.Constant(context);

            metaBuilder.AddTargetTypeTest(target.Value, target.Expression, context, contextExpression);

            RubyMemberInfo method = context.ResolveMethod(target.Value, binder.Name, true).InvalidateSitesOnOverride();
            if (method != null && RubyModule.IsMethodVisible(method, false)) {
                // we need to create a bound member:
                metaBuilder.Result = Ast.Constant(new RubyMethod(target.Value, method, binder.Name));
            } else {
                // TODO:
                // We need to throw an exception if we don't find method_missing so that our version update optimization works: 
                // This limits interop with other languages. 
                //                   
                // class B           CLR type with method 'foo'
                // class C < B       Ruby class
                // x = C.new
                //
                // 1. x.GET("foo") from Ruby
                //    No method found or CLR method found -> fallback to Python
                //    Python might see its method foo or might just fallback to .NET, 
                //    in any case it will add rule [1] with restriction on type of C w/o Ruby version check.
                // 2. B.define_method("foo") 
                //    This doesn't update C due to the optimization (there is no overridden method foo in C).
                // 3. x.GET("foo") from Ruby
                //    This will not invoke the binder since the rule [1] is still valid.
                //
                object symbol = SymbolTable.StringToId(binder.Name);
                RubyCallAction.BindToMethodMissing(metaBuilder, binder.Name,
                    new CallArguments(
                        new MetaObject(contextExpression, Restrictions.Empty, context),
                        new[] { 
                            target,
                            new MetaObject(Ast.Constant(symbol), Restrictions.Empty, symbol) 
                        },
                        RubyCallSignature.Simple(1)
                    ), 
                    method != null
                );
            }

            // TODO: we should return null if we fail, we need to throw exception for now:
            return metaBuilder.CreateMetaObject(binder, MetaObject.EmptyMetaObjects);
        }
Пример #7
0
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                result = null;

                if (_object is JArray)
                {
                    JArray jArray = _object as JArray;
                    switch (binder.Name)
                    {
                        case "Length":
                        case "Count": result = jArray.Count; break;
                        case "ToList": result = (Func<List<string>>)(() => jArray.Values().Select(x => x.ToString()).ToList()); break;
                        case "ToArray": result = (Func<string[]>)(() => jArray.Values().Select(x => x.ToString()).ToArray()); break;
                    }

                    return true;
                }

                JObject jObject = _object as JObject;
                object obj = jObject.SelectToken(binder.Name);
                if (obj == null) return true;

                if (obj is JValue)
                    result = GetValue(obj);
                else
                    result = new JsonObject(obj);

                return true;
            }
Пример #8
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     throw new Exception();
 }
Пример #9
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = _tracker[binder.Name];
     return true;
 }
Пример #10
0
		public override DynamicMetaObject BindGetMember( GetMemberBinder binder )
		{
			DEBUG.IndentLine( "\n-- BindGetMember: {0}", binder.Name );

			var obj = (DynamicNode)this.Value;
			var node = new DynamicNode.GetMember( obj, binder.Name ) { _Parser = obj._Parser };
			obj._Parser._LastNode = node;

			var par = Expression.Variable( typeof( DynamicNode ), "ret" );
			var exp = Expression.Block(
				new ParameterExpression[] { par },
				Expression.Assign( par, Expression.Constant( node ) )
				);

			DEBUG.Unindent();
			return new DynamicMetaNode( exp, this.Restrictions, node );
		}
Пример #11
0
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                if (_values.TryGetValue(binder.Name, out result)) {
                    return true;
                }

                // finds an element of given name:
                switch (binder.Name) {
                    case "element1": result = "e1"; return true;
                    case "element2": result = "e2"; return true;
                }

                result = null;
                return false;
            }
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
 {
     return(IsOverridden("TryGetMember")
         ? CallMethodWithResult("TryGetMember", binder, NoArgs, e => binder.FallbackGetMember(this, e))
         : base.BindGetMember(binder));
 }
Пример #13
0
 public NoThrowGetBinderMember(GetMemberBinder innerBinder)
     : base(innerBinder.Name, innerBinder.IgnoreCase)
 {
     _innerBinder = innerBinder;
 }
 /// <summary>
 /// Performs the binding of the dynamic get member operation.
 /// </summary>
 /// <param name="binder">An instance of the <see cref="GetMemberBinder"/> that represents the details of the dynamic operation.</param>
 /// <returns>The new <see cref="DynamicMetaObject"/> representing the result of the binding.</returns>
 public virtual DynamicMetaObject BindGetMember(GetMemberBinder binder) {
     ContractUtils.RequiresNotNull(binder, "binder");
     return binder.FallbackGetMember(this);
 }
Пример #15
0
            // Forward all dynamic operations or some of them as needed //

            public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
            {
                return(AddRestrictions(_metaForwardee.BindGetMember(binder)));
            }
Пример #16
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = Instance;
     return(true);
 }
Пример #17
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     return(TryGetMemberImpl(binder.Name, out result));
 }
Пример #18
0
 public override bool TryGetMember(JObject instance, GetMemberBinder binder, out object result)
 {
     // result can be null
     result = instance[binder.Name];
     return(true);
 }
Пример #19
0
 public override bool TryGetMember(GetMemberBinder binder, out object result) => accessor.TryGetMember(binder, out result, base.TryGetMember);
Пример #20
0
 /// <summary>
 /// Tries to perform binding of the dynamic get member operation.
 /// </summary>
 /// <param name="binder">An instance of the <see cref="GetMemberBinder"/> that represents the details of the dynamic operation.</param>
 /// <param name="instance">The target of the dynamic operation. </param>
 /// <param name="result">The new <see cref="DynamicMetaObject"/> representing the result of the binding.</param>
 /// <returns>true if operation was bound successfully; otherwise, false.</returns>
 public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result) {
     return TryBindGetMember(binder, instance, out result, false);
 }
Пример #21
0
 public virtual bool TryGetMember(T instance, GetMemberBinder binder, out object result)
 {
     result = null;
     return(false);
 }
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder) => BaseMetaObject.BindGetMember(binder);
Пример #23
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = CheckNone(this.GetAttr(binder.Name));
     return(true);
 }
 public virtual bool TryGetMember(GetMemberBinder binder, out object result) {
     result = null;
     return false;
 }
Пример #25
0
        private static CallSite <Func <CallSite, object, object> > CreateCallSiteGetter(string name)
        {
            GetMemberBinder getMemberBinder = (GetMemberBinder)DynamicUtils.BinderWrapper.GetMember(name, typeof(DynamicUtils));

            return(CallSite <Func <CallSite, object, object> > .Create(new NoThrowGetBinderMember(getMemberBinder)));
        }
Пример #26
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
 {
     Requires.NotNull(binder, nameof(binder));
     return(binder.FallbackGetMember(UnwrapSelf()));
 }
Пример #27
0
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            string name = binder.Name;

            XmlNode firstNode = _element.SelectSingleNode(name);

            if (firstNode != null && firstNode.NodeType == XmlNodeType.Element)
            {
                result = GetResultFromElement(firstNode as XmlElement, _autoType);
                return(true);
            }

            switch (name)
            {
            case "Text":
            case "Value":
                result = _element.InnerText;
                return(true);

            case "Name":
            case "Tag":
                result = _element.Name;
                return(true);

            case "Count":
            case "Length":
                result = GetElements(_element.ParentNode, _element.Name).Count();
                return(true);

            default:
                if (name.EndsWith("Attr"))
                {
                    foreach (string n in PossibleNames(name.Substring(0, name.Length - 4), FuzzyNames, true))
                    {
                        if (_element.HasAttribute(n))
                        {
                            string s = _element.GetAttribute(n);
                            result = !_autoType ? s : GetObjectFromString(s);
                            return(true);
                        }
                    }
                }

                switch (_element.Name)
                {
                // special case to support appSettings section in app/web.configs
                case "appSettings":
                {
                    foreach (string n in PossibleNames(name, FuzzyNames, true))
                    {
                        // no need to sanitize xpath to prevent injection,
                        // because n is value of variable name and
                        // it cannot contain characters required for injection
                        XmlNode node = _element.SelectSingleNode($"add[@key='{n}']");

                        if (node != null && node.NodeType == XmlNodeType.Element)
                        {
                            string s = (node as XmlElement)?.GetAttribute("value");
                            result = !_autoType ? s : GetObjectFromString(s);
                            return(true);
                        }
                    }

                    break;
                }

                // special case to support connectionStrings section in app/web.configs
                case "connectionStrings":
                {
                    foreach (string n in PossibleNames(name, FuzzyNames, true))
                    {
                        // no need to sanitize xpath to prevent injection,
                        // because n is value of variable name and
                        // it cannot contain characters required for injection
                        XmlNode node = _element.SelectSingleNode($"add[@name='{n}']");

                        if (node != null && node.NodeType == XmlNodeType.Element)
                        {
                            result = (node as XmlElement)?.GetAttribute("connectionString");
                            return(true);
                        }
                    }

                    break;
                }
                }

                foreach (string n in PossibleNames(name, FuzzyNames, true))
                {
                    XmlNode node = _element.SelectSingleNode(n);
                    if (node != null && node.NodeType == XmlNodeType.Element)
                    {
                        result = GetResultFromElement(node as XmlElement, _autoType);
                        return(true);
                    }
                }
                break;
            }

            result = null;
            return(NullOnNotFound);
        }
Пример #28
0
 public override DynamicMetaObject/*!*/ BindGetMember(GetMemberBinder/*!*/ member) {
     return MakeMemberAccess(member, member.Name, MemberAccess.Get, this);
 }
Пример #29
0
 /// <summary>
 ///   Provides the implementation for operations that get member values. Classes derived from the <see
 ///    cref="T:System.Dynamic.DynamicObject" /> class can override this method to specify dynamic behavior for operations such as getting a value for a property.
 /// </summary>
 /// <param name="binder"> Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the <see
 ///    cref="T:System.Dynamic.DynamicObject" /> class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. </param>
 /// <param name="result"> The result of the get operation. For example, if the method is called for a property, you can assign the property value to <paramref
 ///    name="result" /> . </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 run-time exception is thrown.) </returns>
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = null;
     return(this.MassageResultBasedOnInterface(binder.Name, true, ref result));
 }
Пример #30
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     return((IsArray)
         ? TryGet(xml.Elements().ElementAtOrDefault(int.Parse(binder.Name)), out result)
         : TryGet(xml.Element(binder.Name), out result));
 }
Пример #31
0
 /// <summary>
 /// Tries to perform binding of the dynamic get member operation.
 /// </summary>
 /// <param name="binder">An instance of the <see cref="GetMemberBinder"/> that represents the details of the dynamic operation.</param>
 /// <param name="instance">The target of the dynamic operation. </param>
 /// <param name="result">The new <see cref="DynamicMetaObject"/> representing the result of the binding.</param>
 /// <returns>true if operation was bound successfully; otherwise, false.</returns>
 public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result)
 {
     return(TryBindGetMember(binder, instance, out result, false));
 }
Пример #32
0
            public override DynamicMetaObject BindGetMember(GetMemberBinder binder) {
                if (binder.Name == "__dict__") {
                    return new DynamicMetaObject(
                        Expression.Property(
                            Utils.Convert(Expression, typeof(PythonModule)),
                            typeof(PythonModule).GetProperty("__dict__")
                        ),
                        BindingRestrictions.GetTypeRestriction(Expression, Value.GetType())
                    );

                }

                var tmp = Expression.Variable(typeof(object), "res");
                
                return new DynamicMetaObject(
                    Expression.Block(
                        new[] { tmp },
                        Expression.Condition(
                            Expression.Call(
                                typeof(PythonOps).GetMethod("ModuleGetMember"),
                                Utils.Convert(Expression, typeof(PythonModule)),
                                Expression.Constant(binder.Name),
                                tmp
                            ),
                            tmp,
                            binder.FallbackGetMember(this).Expression
                        )
                    ),
                    BindingRestrictions.GetTypeRestriction(Expression, Value.GetType())
                );
            }
Пример #33
0
 internal ComGetMemberBinder(GetMemberBinder originalBinder, bool CanReturnCallables) :
     base(originalBinder.Name, originalBinder.IgnoreCase)
 {
     _originalBinder     = originalBinder;
     _CanReturnCallables = CanReturnCallables;
 }
Пример #34
0
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                for (int idx = 0; idx != Names.Length; ++idx)
                {
                    if (binder.Name == Names[idx])
                    {
                        result = idx;
                        return true;
                    }
                }

                result = null;
                return false;
            }
Пример #35
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = ViewData[binder.Name];
     // since ViewDataDictionary always returns a result even if the key does not exist, always return true
     return(true);
 }
Пример #36
0
 public override DynamicMetaObject /*!*/ BindGetMember(GetMemberBinder /*!*/ binder)
 {
     return(InteropBinder.GetMember.Bind(CreateMetaContext(), binder, this, binder.FallbackGetMember));
 }
Пример #37
0
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            string name = binder.Name;

            if (String.CompareOrdinal(name, "Name") == 0)
            {
                result = _element.Name.LocalName;
                return(true);
            }
            else if (String.CompareOrdinal(name, "Parent") == 0)
            {
                XElement parent = _element.Parent;
                if (parent != null)
                {
                    result = new XmlNode(parent);
                    return(true);
                }
                result = null;
                return(false);
            }
            else if (String.CompareOrdinal(name, "Value") == 0)
            {
                result = _element.Value;
                return(true);
            }
            else if (String.CompareOrdinal(name, "Nodes") == 0)
            {
                result = new XmlNodeList(_element.Elements());
                return(true);
            }
            else if (String.CompareOrdinal(name, "Xml") == 0)
            {
                StringWriter sw = new StringWriter();
                _element.Save(sw, SaveOptions.None);

                result = sw.ToString();
                return(true);
            }
            else
            {
                XAttribute attribute = _element.Attribute(name);
                if (attribute != null)
                {
                    result = attribute.Value;
                    return(true);
                }

                XElement childNode = _element.Element(name);
                if (childNode != null)
                {
                    if (childNode.HasElements == false)
                    {
                        result = childNode.Value;
                        return(true);
                    }
                    result = new XmlNode(childNode);
                    return(true);
                }
            }

            return(base.TryGetMember(binder, out result));
        }
Пример #38
0
 internal ComGetMemberBinder(GetMemberBinder originalBinder, bool CanReturnCallables) :
     base(originalBinder.Name, originalBinder.IgnoreCase) {
     _originalBinder = originalBinder;
     _CanReturnCallables = CanReturnCallables;
 }
Пример #39
0
 public override DynamicMetaObject/*!*/ BindGetMember(GetMemberBinder/*!*/ member) {
     return GetMemberWorker(member, BinderState.GetCodeContext(member));            
 }
Пример #40
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = this[binder.Name];
     return true;
 }
Пример #41
0
 public override DynamicMetaObject/*!*/ BindGetMember(GetMemberBinder/*!*/ member) {
     return MakeGetMember(member, PythonContext.GetCodeContextMO(member));
 }
            public override DynamicMetaObject BindGetMember(GetMemberBinder binder) {
                if (IsOverridden("TryGetMember")) {
                    return CallMethodWithResult("TryGetMember", binder, NoArgs, (e) => binder.FallbackGetMember(this, e));
                }

                return base.BindGetMember(binder);
            }
Пример #43
0
		public override bool TryGetMember( GetMemberBinder binder, out object result )
		{
			var meta = _Schema.Find( null, binder.Name, anyTable: true, raise: false );
			if( meta != null ) { int ix = _Schema.IndexOf( meta ); result = _Columns[ix]; }

			// We defer the getter to be located using the binder's name as the table name...
			else result = new KRecordDynamicTable( this, binder.Name );
			return true;
		}
Пример #44
0
		public override bool TryGetMember( GetMemberBinder binder, out object result )
		{
			// Only invoked in forms of type "x => x.Table.Column" ...
			result = new KRecordBuilderDynamicTable( this, binder.Name );
			return true;
		}
Пример #45
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder) {
     IScopeVariable variable = Value.GetVariable(binder.Name, binder.IgnoreCase);
     var tmp = Expression.Parameter(typeof(object));
     return new DynamicMetaObject(
         Expression.Block(
             new[] { tmp },
             Expression.Condition(
                 Expression.Call(
                     Expression.Constant(variable),
                     variable.GetType().GetMethod("TryGetValue"),
                     tmp
                 ),
                 tmp,
                 binder.FallbackGetMember(this).Expression
             )
         ),
         BindingRestrictions.GetInstanceRestriction(Expression, Value)
     );
 }
Пример #46
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = this.Get(binder.ReturnType, binder.Name);
     return(true);
 }
Пример #47
0
        public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
        {
            Schema.Property property;
            if (!_metadata.Schema.TryFindProperty(binder.Name, out property))
            {
                return(base.BindGetMember(binder));
            }

            var arguments = new List <Expression>
            {
                WeakConstant(_metadata.Table),
                Expression.Constant(_metadata.ColumnIndices[property.Name]),
                Expression.Property(Expression.Field(GetLimitedSelf(), RealmObjectRowHandleField), RowHandleRowIndexProperty),
            };

            MethodInfo getter = null;

            switch (property.Type)
            {
            case Schema.PropertyType.Int:
                if (property.IsNullable)
                {
                    getter = GetGetMethod(NativeTable.GetNullableInt64);
                }
                else
                {
                    getter = GetGetMethod(NativeTable.GetInt64);
                }
                break;

            case Schema.PropertyType.Bool:
                if (property.IsNullable)
                {
                    getter = GetGetMethod(NativeTable.GetNullableBoolean);
                }
                else
                {
                    getter = GetGetMethod(NativeTable.GetBoolean);
                }
                break;

            case Schema.PropertyType.Float:
                if (property.IsNullable)
                {
                    getter = GetGetMethod(NativeTable.GetNullableSingle);
                }
                else
                {
                    getter = GetGetMethod(NativeTable.GetSingle);
                }
                break;

            case Schema.PropertyType.Double:
                if (property.IsNullable)
                {
                    getter = GetGetMethod(NativeTable.GetNullableDouble);
                }
                else
                {
                    getter = GetGetMethod(NativeTable.GetDouble);
                }
                break;

            case Schema.PropertyType.String:
                getter = GetGetMethod(NativeTable.GetString);
                break;

            case Schema.PropertyType.Data:
                getter = GetGetMethod(NativeTable.GetByteArray);
                break;

            case Schema.PropertyType.Date:
                if (property.IsNullable)
                {
                    getter = GetGetMethod(NativeTable.GetNullableDateTimeOffset);
                }
                else
                {
                    getter = GetGetMethod(NativeTable.GetDateTimeOffset);
                }
                break;

            case Schema.PropertyType.Object:
                arguments.Insert(0, Expression.Field(GetLimitedSelf(), RealmObjectRealmField));
                arguments.Add(Expression.Constant(property.ObjectType));
                getter = GetGetMethod(RealmObjectOps.GetObject <DynamicRealmObject>);
                break;

            case Schema.PropertyType.Array:
                arguments.Insert(0, Expression.Field(GetLimitedSelf(), RealmObjectRealmField));
                arguments.Add(Expression.Constant(property.ObjectType));
                getter = GetGetMethod(RealmObjectOps.GetList <DynamicRealmObject>);
                break;
            }

            Expression expression = Expression.Call(getter, arguments);

            if (binder.ReturnType != expression.Type)
            {
                expression = Expression.Convert(expression, binder.ReturnType);
            }

            var argumentShouldBeDynamicRealmObject = BindingRestrictions.GetTypeRestriction(Expression, typeof(DynamicRealmObject));
            var argumentShouldBeInTheSameRealm     = BindingRestrictions.GetInstanceRestriction(Expression.Field(GetLimitedSelf(), RealmObjectRealmField), _realm);

            return(new DynamicMetaObject(expression, argumentShouldBeDynamicRealmObject.Merge(argumentShouldBeInTheSameRealm)));
        }
Пример #48
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {            
     result = GetSetting(binder.Name);
     return true;            
 }       
Пример #49
0
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = Context.Properties[binder.Name];

            return(true);
        }
Пример #50
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder) {
     ContractUtils.RequiresNotNull(binder, "binder");
     return binder.FallbackGetMember(UnwrapSelf());
 }
Пример #51
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     return(data.TryGetValue(binder.Name, out result));
 }
Пример #52
0
		public override bool TryGetMember( GetMemberBinder binder, out object result )
		{
			try {
				int ix = _Record.Schema.IndexOf( _Table, binder.Name, anyTable: false );
				if( ix >= 0 ) { result = _Record[ix]; return true; }
				throw new KeyNotFoundException( "Column not found: " + string.Format( "{0}.{1}", _Table, binder.Name ) );
			}
			finally { Dispose(); }
		}
Пример #53
0
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = GetValue(binder.Name);

            return(true);
        }
Пример #54
0
 public override DynamicMetaObject/*!*/ BindGetMember(GetMemberBinder/*!*/ action) {
     return GetMemberWorker(action, BinderState.GetCodeContext(action));
 }
Пример #55
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = this[binder.Name];
     return(true);
 }
Пример #56
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder) {
     return BindGetMemberWorker(binder, binder.Name, PythonContext.GetCodeContextMO(binder));
 }
Пример #57
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
 {
     return(TryBindGetMember(binder.Name) ?? base.BindGetMember(binder));
 }
Пример #58
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder) {
     return DynamicTryGetValue(binder.Name, binder.IgnoreCase, 
         binder.FallbackGetMember(this).Expression,
         (tmp) => tmp
     );
 }
Пример #59
0
 public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     result = new MemberAccessWrapper(HttpClientWrapper, BaseUri, binder.Name, new Dictionary <string, string>());
     return(true);
 }