public override void DeclareSynchronization()
        {
            foreach (var att in oldModelClass.Attributes)
            {
                var newAtt = newModelClass.Attributes.FirstOrDefault(a => a.Name == att.Name);
                if (newAtt != null && att.Type == newAtt.Type && newAtt.LowerBound == att.LowerBound)
                {
                    // Create Synchronize call
                    var lambda = CreateLambdaFor <TOld>(att);
                    singleAttribute
                    .MakeGenericMethod(lambda.ReturnType)
                    .Invoke(this, new object[] { lambda, CreateLambdaFor <TNew>(newAtt) });
                }
            }

            foreach (var oldReference in oldModelClass.References)
            {
                var newReference = newModelClass.References.FirstOrDefault(r => r.Name == oldReference.Name);
                if (newReference != null && newReference.LowerBound == oldReference.LowerBound)
                {
                    // Create Synchronize call
                    var oldLambda = CreateLambdaFor <TOld>(oldReference);
                    var newLambda = CreateLambdaFor <TNew>(newReference);
                    var rule      = Synchronization.GetSynchronizationRuleForSignature(oldLambda.ReturnType, newLambda.ReturnType);
                    singleReference
                    .MakeGenericMethod(oldLambda.ReturnType, newLambda.ReturnType)
                    .Invoke(this, new object[] { rule, oldLambda, newLambda, null });
                }
            }
        }
Exemplo n.º 2
0
        public override void DeclareSynchronization()
        {
            if (modelClass.BaseTypes.Count > 1)
            {
                throw new InvalidOperationException("Model synchronization rules cannot be auto-generated for classes with multiple inheritance.");
            }

            var isModelElementType = typeof(T) == typeof(IModelElement);

            if (!isModelElementType)
            {
                foreach (var att in modelClass.Attributes)
                {
                    if (att.UpperBound == 1)
                    {
                        // Create Synchronize call
                        var lambda = CreateLambdaFor(att, null);
                        singleAttribute
                        .MakeGenericMethod(lambda.ReturnType)
                        .Invoke(this, new object[] { lambda, lambda });
                    }
                    else
                    {
                        // Create SynchronizeMany call
                        var targetType = att.Type.GetExtension <MappedType>().SystemType;
                        var lambda     = CreateLambdaFor(att, typeof(Func <,>).MakeGenericType(typeof(T), typeof(ICollectionExpression <>).MakeGenericType(targetType)));
                        multipleAttribute
                        .MakeGenericMethod(targetType)
                        .Invoke(this, new object[] { lambda, lambda });
                    }
                }

                foreach (var r in modelClass.References)
                {
                    if (r.UpperBound == 1)
                    {
                        // Create Synchronize call
                        var lambda = CreateLambdaFor(r, null);
                        var rule   = Synchronization.GetSynchronizationRuleForSignature(lambda.ReturnType, lambda.ReturnType);
                        singleReference
                        .MakeGenericMethod(lambda.ReturnType)
                        .Invoke(this, new object[] { rule, lambda, lambda, null });
                    }
                    else
                    {
                        // Create SynchronizeMany call
                        var targetType = r.ReferenceType.GetExtension <MappedType>().SystemType;
                        var lambda     = CreateLambdaFor(r, typeof(Func <,>).MakeGenericType(typeof(T), typeof(ICollectionExpression <>).MakeGenericType(targetType)));
                        var rule       = Synchronization.GetSynchronizationRuleForSignature(targetType, targetType);
                        multipleReference
                        .MakeGenericMethod(targetType, targetType)
                        .Invoke(this, new object[] { rule, lambda, lambda });
                    }
                }

                foreach (var baseCl in modelClass.BaseTypes)
                {
                    var mapping = baseCl.GetExtension <MappedType>();
                    var iface   = mapping.SystemType;
                    MarkInstantiatingFor(Synchronization.GetSynchronizationRuleForSignature(iface, iface));
                }
            }

            if (!isModelElementType && modelClass.BaseTypes.Count == 0)
            {
                MarkInstantiatingFor(Synchronization.GetSynchronizationRuleForSignature(typeof(IModelElement), typeof(IModelElement)));
            }
        }