コード例 #1
0
        public void Intercept(IInvocation invocation)
        {
            Entity entity = invocation.InvocationTarget.CastToType <Entity>();

            Debug.Assert(entity.IsNotNull(), "CollectionInterceptor error");
            if (!entity.Disposing)
            {
                string propertyName = invocation.Method.Name;
                if (propertyName.StartsWith("get_"))
                {
                    propertyName = propertyName.Substring(4, propertyName.Length - 4);
                }
                EntityProperty property = entity.EntityCtx.Properties.FirstOrDefault(p => p.Name == propertyName);
                if (property.IsNotNull() && property.ReletedEntity.IsNotNull() &&
                    property.ReletedEntity.Related == Releted.List && property.ReletedEntity.Relation.IsNotNull())
                {
                    EntitiesRelation relation = property.ReletedEntity.Relation;
                    if (!relation.Child.Entity.Uid.Equals(entity.GetUid(propertyName)))
                    {
                        invocation.Proceed();

                        List <T> list = relation.Child.Entity.Entities.Where(c => c.State != EntityState.Deleted && relation.Parent.Value(entity).
                                                                             Equals(relation.Child.Value(c)) &&
                                                                             property.ReletedEntity.Discriminators.TrueForAll(new Predicate <Discriminator>((d) => { return(d.Discriminate(c)); }))).Cast <T>().ToList();

                        if (invocation.ReturnValue.IsNull())
                        {
                            EntitiesCollection <T> collection = new EntitiesCollection <T>(list);
                            collection.Context     = entity.Context;
                            collection.Releted     = property.ReletedEntity;
                            collection.ParentValue = relation.Parent.Value(entity);
                            invocation.ReturnValue = collection;
                            if (property.Setter.IsNotNull())
                            {
                                entity[propertyName] = collection;
                            }
                        }
                        else
                        {
                            EntitiesCollection <T> current = invocation.ReturnValue as EntitiesCollection <T>;
                            current.CopyFromMainCollection = true;
                            list.ForEach((e) => current.AddIfNotContains <T>(e));
                            for (int i = current.Count - 1; i >= 0; i--)
                            {
                                T e = current[i];
                                if (!list.Contains(e))
                                {
                                    current.Remove(e);
                                }
                            }
                            current.CopyFromMainCollection = false;
                        }
                        entity.SetUid(propertyName, relation.Child.Entity.Uid);
                    }
                    else
                    {
                        invocation.Proceed();
                    }
                }
                else
                {
                    Debug.Assert(false, "CollectionInterceptor error");
                }
            }
            else
            {
                invocation.Proceed();
            }
        }
コード例 #2
0
 public static void Remove(ScreenVisibility element) => _entities.Remove(element);