private List <ServableItem> ReflectServableItems() { // Find all GhostLine API attributes in other assemblies Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); // check out the assemblies foreach (var assembly in assemblies) { Log("Assembly found: " + assembly.FullName, LogLevel.Verbose); if (!assembly.FullName.StartsWith("System.") && !assembly.FullName.Equals("GhostLineAPI") && !assembly.FullName.StartsWith("Microsoft")) { _monitoredAssemblies.Add(assembly); } } // look for the fields and properties foreach (var assembly in _monitoredAssemblies) { foreach (var typeObj in assembly.GetTypes()) { PropertyInfo[] props = typeObj.GetProperties(); foreach (PropertyInfo prop in props) { object[] attrs = prop.GetCustomAttributes(true); foreach (object attr in attrs) { GhostReadAttribute gra = attr as GhostReadAttribute; GhostWriteAttribute gwa = attr as GhostWriteAttribute; GhostReadWriteAttribute grwa = attr as GhostReadWriteAttribute; GhostAttribute ga = attr as GhostAttribute; if (gra != null || gwa != null || grwa != null) { var servableItem = new ServableItem { AssemblyFullName = assembly.FullName, Type = prop.PropertyType, PropertyName = prop.Name }; servableItem.GenerateId(); var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id); if (checkItem != null) { servableItem = checkItem; } else { // flesh out the rest if (_parentObj == null) { String message = "Must pass instance object (usually \"this\") when annotating properties due to .NET reflection access restrictions."; Log(message, LogLevel.Critical); throw new ArgumentException(message); } servableItem.Object = prop.GetValue(_parentObj); servableItem.PropertyInfo = prop; } if (gra != null || grwa != null) { servableItem.CanRead = true; servableItem.Version = ga.Version; servableItem.OverriddenName = ga.OverrideName; } if (gwa != null || grwa != null) { servableItem.CanWrite = true; servableItem.Version = ga.Version; servableItem.OverriddenName = ga.OverrideName; } _servableItems.Add(servableItem); } } } FieldInfo[] fields = typeObj.GetFields(); foreach (FieldInfo field in fields) { object[] attrs = field.GetCustomAttributes(true); foreach (object attr in attrs) { GhostReadAttribute gra = attr as GhostReadAttribute; GhostWriteAttribute gwa = attr as GhostWriteAttribute; GhostReadWriteAttribute grwa = attr as GhostReadWriteAttribute; GhostAttribute ga = attr as GhostAttribute; if (gra != null || gwa != null || grwa != null) { var servableItem = new ServableItem { AssemblyFullName = assembly.FullName, Type = field.FieldType, FieldName = field.Name, }; servableItem.GenerateId(); // check to see if this is already a servable item var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id); if (checkItem != null) { servableItem = checkItem; } else { // flesh out the rest if (_parentObj == null) { String message = "Must pass instance object (usually \"this\") when annotating properties due to .NET reflection access restrictions."; Log(message, LogLevel.Critical); throw new ArgumentException(message); } servableItem.Object = field.GetValue(field.Name); servableItem.FieldInfo = field; } if (gra != null || grwa != null) { servableItem.CanRead = true; servableItem.Version = ga.Version; servableItem.OverriddenName = ga.OverrideName; } if (gwa != null || grwa != null) { servableItem.CanWrite = true; servableItem.Version = ga.Version; servableItem.OverriddenName = ga.OverrideName; } _servableItems.Add(servableItem); } } } // all properties and fields should now be in _servableItems } } return(_servableItems); }
private void ReflectServableItems() { // Find all GhostLine API attributes in other assemblies Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); // check out the assemblies foreach (var assembly in assemblies) { //Console.WriteLine("Assembly found: " + assembly.FullName); if (!assembly.FullName.StartsWith("System.") && !assembly.FullName.Equals("GhostLineAPI")) { _monitoredAssemblies.Add(assembly); } } // look for the fields and properties foreach (var assembly in _monitoredAssemblies) { foreach (var typeObj in assembly.GetTypes()) { // PropertyInfo[] props = typeObj.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); // this clips out everything .. ? PropertyInfo[] props = typeObj.GetProperties(); foreach (PropertyInfo prop in props) { object[] attrs = prop.GetCustomAttributes(true); foreach (object attr in attrs) { GhostReadAttribute gra = attr as GhostReadAttribute; GhostWriteAttribute gwa = attr as GhostWriteAttribute; if (gra != null || gwa != null) { var servableItem = new ServableItem { AssemblyFullName = assembly.FullName, Type = prop.PropertyType, PropertyName = prop.Name }; servableItem.GenerateId(); // check to see if this is already a servable item //if (_servableItems.ContainsKey(servableItem.Id)) var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id); //if (_servableItems.Any( si => si.Id == servableItem.Id)) if (checkItem != null) { //servableItem = _servableItems[servableItem.Id]; //servableItem = _servableItems.First(si => si.Id == servableItem.Id); servableItem = checkItem; } else { // flesh out the rest if (_parentObj == null) { throw new ArgumentException("Must pass instance object (usually \"this\") as ParentObj when annotating properties due to .NET reflection access restrictions."); } servableItem.Object = prop.GetValue(_parentObj); servableItem.PropertyInfo = prop; } if (gra != null) { servableItem.CanRead = true; } if (gwa != null) { servableItem.CanWrite = true; } _servableItems.Add(servableItem); } } } FieldInfo[] fields = typeObj.GetFields(); foreach (FieldInfo field in fields) { object[] attrs = field.GetCustomAttributes(true); foreach (object attr in attrs) { GhostReadAttribute gra = attr as GhostReadAttribute; GhostWriteAttribute gwa = attr as GhostWriteAttribute; if (gra != null || gwa != null) { var servableItem = new ServableItem { AssemblyFullName = assembly.FullName, Type = field.FieldType, //.PropertyType, FieldName = field.Name //prop.Name }; servableItem.GenerateId(); // check to see if this is already a servable item var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id); if (checkItem != null) { servableItem = checkItem; } else { // flesh out the rest if (_parentObj == null) { throw new ArgumentException("Must pass instance object (usually \"this\") when annotating properties due to .NET reflection access restrictions."); } servableItem.Object = field.GetValue(field.Name); servableItem.FieldInfo = field; } if (gra != null) { servableItem.CanRead = true; } if (gwa != null) { servableItem.CanWrite = true; } _servableItems.Add(servableItem); } } } // all properties and fields should now be in _servableItems } } }