public EdmToClrConverter(TryCreateObjectInstance tryCreateObjectInstanceDelegate)
 {
     this.convertedObjects     = new Dictionary <IEdmStructuredValue, object>();
     this.enumTypeConverters   = new Dictionary <Type, MethodInfo>();
     this.enumerableConverters = new Dictionary <Type, MethodInfo>();
     EdmUtil.CheckArgumentNull <TryCreateObjectInstance>(tryCreateObjectInstanceDelegate, "tryCreateObjectInstanceDelegate");
     this.tryCreateObjectInstanceDelegate = tryCreateObjectInstanceDelegate;
 }
Exemple #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="EdmToClrConverter"/> class.
 /// </summary>
 /// <param name="tryCreateObjectInstanceDelegate">The delegate customizing conversion of structured values.</param>
 /// <param name="tryGetClrPropertyInfoDelegate">The delegate customizing the behavior to get client CLR property info</param>
 /// <param name="tryGetClrTypeNameDelegate">The delegate customizing the behavior to get client CLR type name</param>
 public EdmToClrConverter(
     TryCreateObjectInstance tryCreateObjectInstanceDelegate,
     TryGetClrPropertyInfo tryGetClrPropertyInfoDelegate,
     TryGetClrTypeName tryGetClrTypeNameDelegate)
 {
     this.tryCreateObjectInstanceDelegate = tryCreateObjectInstanceDelegate;
     this.tryGetClrPropertyInfoDelegate   = tryGetClrPropertyInfoDelegate;
     this.TryGetClrTypeNameDelegate       = tryGetClrTypeNameDelegate;
 }
        public void ClrTypeMappingValueAnnotationTryPopulateObjectInstance()
        {
            this.InitializeOperationDefinitions();

            EdmToClrEvaluator ev = new EdmToClrEvaluator(this.operationDefinitions);

            var edmModel = this.GetParserResult(ClrTypeMappingTestModelBuilder.ValueAnnotationClassTypeBasicTest(), this.operationDeclarationModel);
            var value    = ev.Evaluate(this.GetValueAnnotations(edmModel, edmModel.FindType("NS1.Person"), "TVDisplay").Single().Value);

            var    isObjectPopulated     = false;
            var    isObjectInitialized   = true;
            object createdObjectInstance = new Display1()
            {
                X = 0, Y = 1
            };
            TryCreateObjectInstance tryCreateObjectInstance = (IEdmStructuredValue edmValue, Type clrType, EdmToClrConverter converter, out object objectInstance, out bool objectInstanceInitialized) =>
            {
                objectInstance            = createdObjectInstance;
                objectInstanceInitialized = isObjectPopulated;
                return(isObjectInitialized);
            };

            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);

            this.VerifyThrowsException(typeof(InvalidCastException), () => ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)));

            isObjectPopulated     = false;
            isObjectInitialized   = false;
            createdObjectInstance = new Display1()
            {
                X = 0, Y = 1
            };
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            isObjectPopulated     = true;
            isObjectInitialized   = true;
            createdObjectInstance = new Display1()
            {
                X = 0, Y = 1
            };
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            this.VerifyThrowsException(typeof(InvalidCastException), () => ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)));
        }
Exemple #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="EdmToClrConverter"/> class.
        /// </summary>
        /// <param name="tryCreateObjectInstanceDelegate">The delegate customizing conversion of structured values.</param>
        public EdmToClrConverter(TryCreateObjectInstance tryCreateObjectInstanceDelegate)
        {
            EdmUtil.CheckArgumentNull(tryCreateObjectInstanceDelegate, "tryCreateObjectInstanceDelegate");

            this.tryCreateObjectInstanceDelegate = tryCreateObjectInstanceDelegate;
        }
        public void ClrTypeMappingValueAnnotationTryCreateObjectInstance()
        {
            this.InitializeOperationDefinitions();

            EdmToClrEvaluator ev = new EdmToClrEvaluator(this.operationDefinitions);

            var edmModel = this.GetParserResult(ClrTypeMappingTestModelBuilder.ValueAnnotationClassTypeBasicTest(), this.operationDeclarationModel);
            var value    = ev.Evaluate(this.GetValueAnnotations(edmModel, edmModel.FindType("NS1.Person"), "TVDisplay").Single().Value);

            var    isObjectPopulated     = true;
            var    isObjectInitialized   = true;
            object createdObjectInstance = null;
            TryCreateObjectInstance tryCreateObjectInstance = (IEdmStructuredValue edmValue, Type clrType, EdmToClrConverter converter, out object objectInstance, out bool objectInstanceInitialized) =>
            {
                objectInstance            = createdObjectInstance;
                objectInstanceInitialized = isObjectPopulated;
                return(isObjectInitialized);
            };

            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsNull((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), "The returned object should be null.");

            isObjectPopulated    = false;
            isObjectInitialized  = true;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsNull((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), "The returned object should be null.");

            isObjectPopulated    = true;
            isObjectInitialized  = false;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            isObjectPopulated    = false;
            isObjectInitialized  = false;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            createdObjectInstance = new Display2()
            {
                X = 0, Y = 1, Origin = new Display1 {
                    X = 3, Y = 4
                }
            };
            isObjectPopulated    = true;
            isObjectInitialized  = true;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), createdObjectInstance), "The returned object has incorrect values.");

            ev.EdmToClrConverter = new EdmToClrConverter((IEdmStructuredValue edmValue, Type clrType, EdmToClrConverter converter, out object objectInstance, out bool objectInstanceInitialized) =>
            {
                if (clrType == typeof(Display2))
                {
                    objectInstance = new Display2()
                    {
                        X = 0, Y = 1, Origin = new Display1 {
                            X = 3, Y = 4
                        }
                    };
                    objectInstanceInitialized = false;
                    return(true);
                }
                else if (clrType == typeof(Display1))
                {
                    objectInstance = new Display1 {
                        X = 3, Y = 4
                    };
                    objectInstanceInitialized = false;
                    return(true);
                }
                else
                {
                    objectInstance            = null;
                    objectInstanceInitialized = false;
                    return(false);
                }
            });
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            isObjectPopulated     = false;
            isObjectInitialized   = true;
            createdObjectInstance = new DisplayCoordination();
            ev.EdmToClrConverter  = new EdmToClrConverter(tryCreateObjectInstance);
            Coordination actual   = (Coordination)ev.EdmToClrConverter.AsClrValue(value, typeof(Coordination));
            Coordination expected = new Coordination()
            {
                X = 10, Y = 20
            };

            Assert.AreEqual(expected.X, actual.X, "The returned object has incorrect values. X");
            Assert.AreEqual(expected.Y, actual.Y, "The returned object has incorrect values. X");
        }