public IObjectChangeTrackingConfiguration TrackTypesFromAssembly(Assembly assembly, Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null) { searchSettings = searchSettings ?? DefaultSearchSettings; if (searchSettings.Mode == TypeSearchMode.AttributeConfigurationOnly) { if (searchSettings.Filter != null) { Func <Type, bool> initialFilter = searchSettings.Filter; searchSettings.Filter = t => initialFilter(t) && t.GetTypeInfo().GetCustomAttribute <ChangeTrackableAttribute>() != null; } else { searchSettings.Filter = t => t.GetTypeInfo().GetCustomAttribute <ChangeTrackableAttribute>() != null; } } foreach (Type type in assembly.GetTypes()) { if (searchSettings.Filter == null || searchSettings.Filter(type)) { if (!searchSettings.Recursive) { TrackThisType(type, configure); } else { TrackThisTypeRecursive(type, configure, searchSettings); } } } return(this); }
public IObjectChangeTrackingConfiguration TrackThisTypeRecursive(Type rootType, Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null) { TrackableType trackableRoot = new TrackableType(this, rootType); ConfigureWithAttributes(trackableRoot); List <TrackableType> trackableTypes = null; searchSettings = searchSettings ?? DefaultSearchSettings; if (searchSettings.Filter == null) { searchSettings.Filter = t => t.GetTypeInfo().Assembly == rootType.GetTypeInfo().Assembly; } if (searchSettings.Mode == TypeSearchMode.AttributeConfigurationOnly) { Func <Type, bool> initialFilter = searchSettings.Filter; searchSettings.Filter = t => initialFilter(t) && t.GetTypeInfo().GetCustomAttribute <ChangeTrackableAttribute>() != null; } trackableTypes = new List <TrackableType> ( rootType.GetAllPropertyTypesRecursive(p => p.PropertyType.GetTypeInfo().IsClass&& searchSettings.Filter(p.PropertyType)).Select ( t => { TrackableType trackableType = new TrackableType(this, t); ConfigureWithAttributes(trackableType); configure?.Invoke(trackableType); return(trackableType); } ) ); trackableTypes.Insert(0, new TrackableType(this, rootType)); foreach (ITrackableType trackableType in trackableTypes) { if (!trackableType.Type.GetTypeInfo().IsInterface) { TrackableTypes.Add(trackableType); } else { TrackableInterfaceTypes.Add(trackableType); } } return(this); }
public IObjectChangeTrackingConfiguration TrackTypesFromAssembly(string assemblyName, Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null) { return(TrackTypesFromAssembly(Assembly.Load(new AssemblyName(assemblyName)), configure, searchSettings)); }
public IObjectChangeTrackingConfiguration TrackThisTypeRecursive <TRoot>(Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null) { return(TrackThisTypeRecursive(typeof(TRoot), configure, searchSettings)); }