Пример #1
0
        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);
        }
Пример #2
0
        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
                }
            }
        }