private void Employees_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: var dto = (EmployeeDataTransfer)e.NewItems[0]; if (!Added.Contains(dto)) { Added.Add((EmployeeDataTransfer)e.NewItems[0]); } break; } }
/// <summary> /// Merges a <see cref="ModelValueChangeEvent"/> into the current event. /// </summary> /// <param name="e"></param> /// <returns></returns> protected override bool OnMerge(ModelEvent e) { // Ensure the events are for the same reference property var listChange = (ModelListChangeEvent)e; if (listChange.Property != Property) { return(false); } // Highly likely not to be right var mergeAdded = Added.ToList(); mergeAdded.RemoveAll(i => listChange.Removed.Contains(i)); var mergeRemoved = Removed.ToList(); mergeRemoved.RemoveAll(i => listChange.Added.Contains(i)); mergeAdded = mergeAdded.Union(listChange.Added.Where(i => !Removed.Contains(i))).ToList(); mergeRemoved = mergeRemoved.Union(listChange.Removed.Where(i => !Added.Contains(i))).ToList(); Added = mergeAdded.ToArray(); Removed = mergeRemoved.ToArray(); var mergeAddedIds = AddedIds.ToList(); mergeAddedIds.RemoveAll(i => listChange.RemovedIds.Contains(i)); var mergeRemovedIds = RemovedIds.ToList(); mergeRemovedIds.RemoveAll(i => listChange.AddedIds.Contains(i)); mergeAddedIds = mergeAddedIds.Union(listChange.AddedIds.Where(i => !RemovedIds.Contains(i))).ToList(); mergeRemovedIds = mergeRemovedIds.Union(listChange.RemovedIds.Where(i => !AddedIds.Contains(i))).ToList(); AddedIds = mergeAddedIds.ToArray(); RemovedIds = mergeRemovedIds.ToArray(); return(true); }
public bool TryAdd(Type service, Type implementation = null) { if (service.IsInterface && service.IsGenericType && implementation == null && (service.GetGenericTypeDefinition() == typeof(IOptionsSnapshot <>) || service.GetGenericTypeDefinition() == typeof(IOptions <>) || service.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>) )) { service = service.GetGenericArguments().FirstOrDefault(); if (service == null) { return(false); } } var serviceName = $"{service}{implementation}"; if (Added.Contains(serviceName)) { return(false); } Added.Add(serviceName); var di = service.IsGenericType && ( service.GetGenericTypeDefinition() == typeof(IConfigureOptions <>) || service.GetGenericTypeDefinition() == typeof(IPostConfigureOptions <>) || service.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>) ) && implementation != null?implementation.GetCustomAttribute <DIAttribute>() : service.GetCustomAttribute <DIAttribute>(); var isnew = false; if (di != null) { if (di.Additional != null) { var m = di.Additional.GetMethod("Register", BindingFlags.Public | BindingFlags.Static); m.Invoke(null, new[] { this }); } if (!service.IsInterface || implementation != null) { isnew = implementation != null?Register(service, implementation) : Register(service); if (!isnew) { return(false); } } if (service.IsInterface && implementation == null || !service.IsInterface) { if (di.Service != null) { var a = di.Service.GetInterfaces().FirstOrDefault(x => x.IsGenericType && ( x.GetGenericTypeDefinition() == typeof(IConfigureOptions <>) || x.GetGenericTypeDefinition() == typeof(IPostConfigureOptions <>) || x.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>) )); if (a != null) { if (!a.ContainsGenericParameters) { var b = a.GetGenericArguments(); foreach (var g in b) { if (g != service) { TryAdd(g); if (service.IsInterface && di.Implementation == null) { TryAdd(service, g); } } } TryAdd(a, di.Service); } else { Type c = null; var a1 = a.GetGenericTypeDefinition(); var b = a.GetGenericArguments().FirstOrDefault(); if (b != null && b.IsGenericType) { var b1 = b.GetGenericTypeDefinition().MakeGenericType(service.GetGenericArguments()); TryAdd(b1); c = a1.MakeGenericType(b1); } else { c = a1.MakeGenericType(service.GetGenericArguments()); } TryAdd(c, di.Service.MakeGenericType(service.GetGenericArguments())); //a, di.Service } } else { if (di.Implementation == null) { isnew = Register(service, di.Service); TryAdd(di.Service); } else { Register(di.Service); } } } if (di.Implementation != null) { var a = di.Implementation.GetInterfaces().FirstOrDefault(x => x.IsGenericType && (x.GetGenericTypeDefinition() == typeof(IConfigureOptions <>) || x.GetGenericTypeDefinition() == typeof(IPostConfigureOptions <>) || x.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>)) ); if (a != null) { if (!a.ContainsGenericParameters) { var b = a.GetGenericArguments(); foreach (var g in b) { if (g != service) { //TryAdd(g); if (service.IsInterface && implementation == null) { TryAdd(service, g); } } } TryAdd(a, di.Implementation); } else { Type c = null; var a1 = a.GetGenericTypeDefinition(); var b = a.GetGenericArguments().FirstOrDefault(); if (b != null && b.IsGenericType) { var b1 = b.GetGenericTypeDefinition().MakeGenericType(service.GetGenericArguments()); TryAdd(b1); c = a1.MakeGenericType(b1); } else { c = a1.MakeGenericType(service.GetGenericArguments()); } TryAdd(c, di.Implementation.MakeGenericType(service.GetGenericArguments())); //a, di.Service } } else { isnew = TryAdd(service, di.Implementation); } } } } if (isnew) { ConstructorInfo[] props = null; if (!service.IsInterface) { props = service.GetConstructors(); } else if (implementation != null) { props = implementation.GetConstructors(); } else if (di.Service != null) { props = di.Service.GetConstructors(); } if (props != null) { var par = props.SelectMany(r => r.GetParameters()).Distinct(); foreach (var p1 in par) { TryAdd(p1.ParameterType); } } } return(isnew); }