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))); }
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); }
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)); }
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))); }