public override void Apply(DynamicTypeBuilder typeBuilder)
        {
            var properties = from p in typeBuilder.BaseType.GetProperties()
                             let set = p.GetSetMethod(true)
                                       where set != null && (set.IsPublic || set.IsFamily)
                                       select p;

            if (NotifyPropertyChanged)
            {
                foreach (var item in properties)
                {
                    typeBuilder.AddMember(new DynamicProperty(item.Name, item.PropertyType));
                }
            }

            this.TransactionProxyProperties = new Collection <TransactionProxyProperty>();

            foreach (var item in properties)
            {
                var tpp = new TransactionProxyProperty {
                    Property = item
                };
                tpp.HasMultipleValuesProperty = new DynamicProperty(
                    string.Format("{0}_HasMultipleValues", item.Name),
                    typeof(bool),
                    false);

                tpp.ValuesProperty = new DynamicProperty(
                    string.Format("{0}_Values", item.Name),
                    typeof(Dictionary <,>).MakeGenericType(typeof(Key <>).MakeGenericType(item.PropertyType), typeof(List <>).MakeGenericType(typeBuilder.BaseType)),
                    true);
                typeBuilder.AddMember(tpp.HasMultipleValuesProperty);
                typeBuilder.AddMember(tpp.ValuesProperty);
                this.TransactionProxyProperties.Add(tpp);
            }

            this.TargetsField = new DynamicField(Guid.NewGuid().ToString(), typeof(List <>).MakeGenericType(typeBuilder.BaseType));
            typeBuilder.AddMember(this.TargetsField);

            this.CommitMethod = new CommitMethod();
            typeBuilder.AddMember(this.CommitMethod);
            this.RollbackMethod = new RollbackMethod();
            typeBuilder.AddMember(this.RollbackMethod);
            this.GetTransactionProxyTargetsMethod = new Methods.GetTransactionProxyTargetsMethod();
            typeBuilder.AddMember(this.GetTransactionProxyTargetsMethod);
            this.GetTransactionProxyTypedTargetsMethod = new Methods.GetTransactionProxyTypedTargetsMethod(typeBuilder.BaseType);
            typeBuilder.AddMember(this.GetTransactionProxyTypedTargetsMethod);
            this.SetTransactionProxyTargetsMethod = new Methods.SetTransactionProxyTargetsMethod();
            typeBuilder.AddMember(this.SetTransactionProxyTargetsMethod);
            this.SetTransactionProxyTypedTargetsMethod = new Methods.SetTransactionProxyTypedTargetsMethod(typeBuilder.BaseType);
            typeBuilder.AddMember(this.SetTransactionProxyTypedTargetsMethod);

            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor <ICommitable>());
            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor <ITransactionProxy>());
            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor(typeof(ITransactionProxy <>).MakeGenericType(typeBuilder.BaseType)));
        }
Exemple #2
0
        public void DynamicTypeBuilderPropertyNewNotificationOverride()
        {
            var dtb = new DynamicTypeBuilder <NonVirtualNotificationBaseProperties>();

            dtb.AddMember(new DynamicProperty("StringProperty", typeof(string)));
            dtb.AddMember(new DynamicProperty("IntProperty", typeof(int)));
            dtb.AddMember(new DynamicProperty("ByteArrayProperty", typeof(byte[])));
            dtb.AddMember(new DynamicProperty("BlaProperty", typeof(string)));

            dtb.AddConvention(new NotifyPropertyChangedConvention());

            var type     = dtb.GeneratedType;
            var instance = Activator.CreateInstance(type);

            Assert.NotNull(instance);

            string changedProperty = null;

            ((INotifyPropertyChanged)instance).PropertyChanged += (s, ea) => changedProperty = ea.PropertyName;

            type.GetProperties().First(p => p.Name == "StringProperty" && p.DeclaringType == type).SetValue(instance, "Bla");
            Assert.Equal("StringProperty", changedProperty);

            changedProperty = null;
            ((NonVirtualNotificationBaseProperties)instance).StringProperty = "Bla2";
            Assert.Equal("StringProperty", changedProperty);

            changedProperty = null;
            type.GetProperties().First(p => p.Name == "IntProperty" && p.DeclaringType == type).SetValue(instance, 123);
            Assert.Equal("IntProperty", changedProperty);

            changedProperty = null;
            ((NonVirtualNotificationBaseProperties)instance).IntProperty = 456;
            Assert.Equal("IntProperty", changedProperty);

            changedProperty = null;
            type.GetProperties().First(p => p.Name == "ByteArrayProperty" && p.DeclaringType == type).SetValue(instance, new byte[] { 1, 2, 3 });
            Assert.Equal("ByteArrayProperty", changedProperty);

            changedProperty = null;
            ((NonVirtualNotificationBaseProperties)instance).ByteArrayProperty = new byte[] { 4, 5, 6 };
            Assert.Equal("ByteArrayProperty", changedProperty);

            changedProperty = null;
            type.GetProperties().First(p => p.Name == "BlaProperty" && p.DeclaringType == type).SetValue(instance, "test");
            Assert.Equal("BlaProperty", changedProperty);
        }
Exemple #3
0
        public override void Apply(DynamicTypeBuilder typeBuilder)
        {
            if (!typeof(INotifyPropertyChanged).IsAssignableFrom(typeBuilder.BaseType))
            {
                if (!typeBuilder.Interceptors.OfType <ImplementInterfaceInterceptor <INotifyPropertyChanged> >().Any())
                {
                    typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor <INotifyPropertyChanged>());
                }
                if (typeBuilder.BaseType.GetEvent("PropertyChanged") == null && !typeBuilder.DynamicMembers.OfType <DynamicEvent>().Any(p => p.MemberName == "PropertyChanged"))
                {
                    typeBuilder.AddMember(new DynamicEvent("PropertyChanged", typeof(PropertyChangedEventHandler)));
                    typeBuilder.AddMember(new RaisePropertyChangedMethod());
                }
            }

            typeBuilder.DynamicMembers.OfType <DynamicProperty>().ToList().ForEach(p => p.AddSetInterceptor(new RaisePropertyChangedInterceptor()));
        }
    { public override void Apply(DynamicTypeBuilder typeBuilder)
      {
          var isDynamicObject          = typeof(DynamicObjectBase).IsAssignableFrom(typeBuilder.BaseType);
          var hasPropertyHostInterface = typeof(IDynamicPropertyHost).IsAssignableFrom(typeBuilder.BaseType);

          if (typeBuilder.DynamicMembers.OfType <DynamicProperty>().Any() || isDynamicObject)
          {
              if (!typeBuilder.DynamicMembers.OfType <SetValueMethod>().Any())
              {
                  typeBuilder.AddMember(new SetValueMethod());
              }
              if (!typeBuilder.DynamicMembers.OfType <GetValueMethod>().Any())
              {
                  typeBuilder.AddMember(new GetValueMethod());
              }

              if (!hasPropertyHostInterface)
              {
                  typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor <IDynamicPropertyHost>());
              }
          }
      }
        public override void Apply(DynamicTypeBuilder typeBuilder)
        {
            foreach (var item in InterfaceType.GetProperties())
            {
                typeBuilder.AddMember(new DynamicInterfaceProperty(item.Name, item.PropertyType));
            }

            foreach (var item in InterfaceType.GetEvents())
            {
                typeBuilder.AddMember(new DynamicEvent(item.Name, item.EventHandlerType));
            }

            foreach (var item in InterfaceType.GetMethods().Except(InterfaceType.GetProperties().SelectMany(p => p.GetAccessors())))
            {
                if (item.ReturnType != typeof(void))
                {
                    throw new InvalidOperationException("The interface can only contain void Methods, Properties and Events!");
                }

                typeBuilder.AddMember(new DynamicVoid(item.Name, item.GetParameters().Select(p => p.ParameterType).ToArray()));
            }

            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor(InterfaceType));
        }
Exemple #6
0
        public override void Apply(DynamicTypeBuilder typeBuilder)
        {
            if (!this.ProxyType.GetTypeInfo().IsInterface)
            {
                throw new InvalidOperationException("The generic argument T must be an interface!");
            }

            var prop = this.ProxyTarget;

            typeBuilder.AddMember(prop);

            var interfaces = this.ProxyType.GetInterfaces().Union(new[] { this.ProxyType });

            foreach (var item in interfaces.SelectMany(p => p.GetMethods()).Distinct())
            {
                typeBuilder.AddMember(new ProxyMethod(item, prop));
            }

            foreach (var item in interfaces.SelectMany(p => p.GetProperties()).Distinct())
            {
                typeBuilder.AddMember(new DynamicProxyProperty(item, prop));
            }

            foreach (var item in interfaces.SelectMany(p => p.GetEvents()).Distinct())
            {
                typeBuilder.AddMember(new DynamicProxyEvent(item, prop));
            }

            if (!typeBuilder.DynamicMembers.OfType <SetProxyTargetMethod>().Any())
            {
                typeBuilder.AddMember(new SetProxyTargetMethod());
            }

            if (!typeBuilder.DynamicMembers.OfType <GetProxyTargetMethod>().Any())
            {
                typeBuilder.AddMember(new GetProxyTargetMethod());
            }

            foreach (var item in interfaces)
            {
                typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor(item));
            }

            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor <IDynamicProxy>());
        }
        public override void Apply(DynamicTypeBuilder typeBuilder)
        {
            var properties = from p in ItemType.GetProperties()
                             let set = p.GetSetMethod(true)
                                       where set != null && (set.IsPublic || set.IsFamily)
                                       select p;

            this.TransactionProxyProperties = new Collection <TransactionProxyProperty>();

            var baseTypeNotifications = !ItemType.IsInterface && ItemType.GetInterfaces().Contains(typeof(INotifyPropertyChanged));

            foreach (var item in properties)
            {
                DynamicProperty baseProp = null;

                if (IsInterface)
                {
                    baseProp = new DynamicInterfaceProperty(item.Name, item.PropertyType);
                }
                else
                {
                    baseProp = new DynamicProperty(item.Name, item.PropertyType);
                }

                var tpp = new TransactionProxyProperty {
                    Property = item, DynamicProperty = baseProp
                };

                tpp.HasMultipleValuesProperty = new DynamicProperty(
                    $"{item.Name}_HasMultipleValues",
                    typeof(bool),
                    false);

                tpp.ValuesProperty = new DynamicProperty(
                    $"{item.Name}_Values",
                    typeof(Dictionary <,>).MakeGenericType(typeof(Key <>).MakeGenericType(item.PropertyType), typeof(List <>).MakeGenericType(ItemType)),
                    true);

                typeBuilder.AddMember(baseProp);
                typeBuilder.AddMember(tpp.HasMultipleValuesProperty);
                typeBuilder.AddMember(tpp.ValuesProperty);

                if (NotifyPropertyChanged)
                {
                    tpp.DynamicProperty.AddSetInterceptor(new ResetHasMultipleValuesInterceptor());
                }

                this.TransactionProxyProperties.Add(tpp);
            }

            this.TargetsField = new DynamicField(Guid.NewGuid().ToString(), typeof(List <>).MakeGenericType(ItemType));
            typeBuilder.AddMember(this.TargetsField);

            this.CommitMethod = new CommitMethod();
            typeBuilder.AddMember(this.CommitMethod);
            this.RollbackMethod = new RollbackMethod();
            typeBuilder.AddMember(this.RollbackMethod);
            this.GetTransactionProxyTargetsMethod = new Methods.GetTransactionProxyTargetsMethod();
            typeBuilder.AddMember(this.GetTransactionProxyTargetsMethod);
            this.GetTransactionProxyTypedTargetsMethod = new Methods.GetTransactionProxyTypedTargetsMethod(ItemType);
            typeBuilder.AddMember(this.GetTransactionProxyTypedTargetsMethod);
            this.SetTransactionProxyTargetsMethod = new Methods.SetTransactionProxyTargetsMethod();
            typeBuilder.AddMember(this.SetTransactionProxyTargetsMethod);
            this.SetTransactionProxyTypedTargetsMethod = new Methods.SetTransactionProxyTypedTargetsMethod(ItemType);
            typeBuilder.AddMember(this.SetTransactionProxyTypedTargetsMethod);

            this.GetValueEntiresMethod = new Methods.GetValueEntriesMethod();
            typeBuilder.AddMember(this.GetValueEntiresMethod);

            this.GetValueEntiresTypedMethod = new Methods.GetValueEntriesTypedMethod(ItemType);
            typeBuilder.AddMember(this.GetValueEntiresTypedMethod);

            this.HasMultipleValuesMethod = new Methods.HasMultipleValuesMethod();
            typeBuilder.AddMember(this.HasMultipleValuesMethod);

            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor <ICommitable>());
            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor <ITransactionProxy>());
            typeBuilder.AddInterceptor(new ImplementInterfaceInterceptor(typeof(ITransactionProxy <>).MakeGenericType(ItemType)));
        }