private static dynamic InvokeAccessorOn(dynamic aDynamicObject, DynamicPropertyAccessExpressionBuilder accessBuilder,
                                                Expression accessorExpression)
        {
            var result = Expression.Lambda <Func <object, object> >(accessorExpression,
                                                                    new[] { accessBuilder.ParameterExpression })
                         .Compile().Invoke(aDynamicObject);

            return(result);
        }
        public void Should_throw_for_accessor_for_anonymous_types()
        {
            const string expectedValue  = "Bar";
            dynamic      aDynamicObject = new { Foo = expectedValue };

            var accessBuilder      = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            Assert.Throws <Microsoft.CSharp.RuntimeBinder.RuntimeBinderException>(() => InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression));
        }
        public void Should_create_accessor_for_property_with_complex_type()
        {
            const string expectedValue = "Bar";
            dynamic aDynamicObject = new ExpandoObject();
            aDynamicObject.Complex = new Customer { Name = expectedValue };

            var accessBuilder = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Complex.Name");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);
            Assert.Equal(expectedValue, result);
        }
        public void Should_create_accessor_for_dynamic_object_indexer()
        {
            const string expectedValue = "Foo1";
            dynamic aDynamicObject = new[] { expectedValue, "Foo2", "Foo3" };

            var accessBuilder = new DynamicPropertyAccessExpressionBuilder(typeof(object), "[0]");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);

            Assert.Equal(expectedValue, (string)result);
        }
        public void Should_create_accessor_for_dynamic_object_indexer()
        {
            const string expectedValue  = "Foo1";
            dynamic      aDynamicObject = new[] { expectedValue, "Foo2", "Foo3" };

            var accessBuilder      = new DynamicPropertyAccessExpressionBuilder(typeof(object), "[0]");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);

            Assert.Equal(expectedValue, (string)result);
        }
        public void Should_create_accessor_which_when_executed_returns_property_value()
        {
            const string expectedValue = "Bar";
            dynamic aDynamicObject = new ExpandoObject();
            aDynamicObject.Foo = expectedValue;

            var accessBuilder = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);

            Assert.Equal(expectedValue, result);
        }
        public void Should_create_accessor_which_when_executed_returns_property_value()
        {
            const string expectedValue  = "Bar";
            dynamic      aDynamicObject = new ExpandoObject();

            aDynamicObject.Foo = expectedValue;

            var accessBuilder      = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);

            Assert.Equal(expectedValue, result);
        }
        public void Should_not_throw_if_accessed_property_value_is_null()
        {
            const object nullValue = null;

            dynamic aDynamicObject = new ExpandoObject();

            aDynamicObject.Foo = nullValue;

            var accessBuilder      = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);

            Assert.Null(result);
        }
        public void Should_create_accessor_for_property_with_complex_type()
        {
            const string expectedValue  = "Bar";
            dynamic      aDynamicObject = new ExpandoObject();

            aDynamicObject.Complex = new Customer {
                Name = expectedValue
            };

            var accessBuilder      = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Complex.Name");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);

            Assert.Equal(expectedValue, result);
        }
        public void Should_throw_for_accessor_for_anonymous_types()
        {
            const string expectedValue = "Bar";
            dynamic aDynamicObject = new { Foo = expectedValue };

            var accessBuilder = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            Assert.Throws<Microsoft.CSharp.RuntimeBinder.RuntimeBinderException>(() => InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression));
        }
        public void Should_not_throw_if_accessed_property_value_is_null()
        {
            const object nullValue = null;

            dynamic aDynamicObject = new ExpandoObject();
            aDynamicObject.Foo = nullValue;

            var accessBuilder = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");
            var accessorExpression = accessBuilder.CreateMemberAccessExpression();

            var result = InvokeAccessorOn(aDynamicObject, accessBuilder, accessorExpression);

            Assert.Null(result);
        }
 public void Should_create_accessor_for_dynamic_object_property()
 {
     var propertyAccessExpression = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");
     Assert.NotNull(propertyAccessExpression.CreateMemberAccessExpression());
 }
 private static dynamic InvokeAccessorOn(dynamic aDynamicObject, DynamicPropertyAccessExpressionBuilder accessBuilder, 
     Expression accessorExpression)
 {
     var result = Expression.Lambda<Func<object, object>>(accessorExpression,
                                                              new[] { accessBuilder.ParameterExpression })
                                                              .Compile().Invoke(aDynamicObject);
     return result;
 }
        public void Should_create_accessor_for_dynamic_object_property()
        {
            var propertyAccessExpression = new DynamicPropertyAccessExpressionBuilder(typeof(object), "Foo");

            Assert.NotNull(propertyAccessExpression.CreateMemberAccessExpression());
        }