コード例 #1
0
        private IEnumerable <KeyValuePair <string, PropertyDescriptor> > GetObjectProperties(ObjectWrapper objectWrapper)
        {
            var target = objectWrapper.Target;

            if (target is IDictionary dictionary)
            {
                foreach (DictionaryEntry entry in dictionary)
                {
                    var jsValue    = JsValue.FromObject(_scriptEngine, entry.Value);
                    var descriptor = new PropertyDescriptor(jsValue, false, false, false);
                    yield return(new KeyValuePair <string, PropertyDescriptor>(entry.Key.ToString(), descriptor));
                }
                yield break;
            }

            var type = target.GetType();

            if (target is Task task &&
                task.IsCompleted == false)
            {
                foreach (var property in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                {
                    if (property.CanRead == false)
                    {
                        continue;
                    }

                    if (property.Name == nameof(Task <int> .Result))
                    {
                        var taskResultDescriptor = JintPreventResolvingTasksReferenceResolver.GetRunningTaskResult(task);
                        yield return(new KeyValuePair <string, PropertyDescriptor>(property.Name, taskResultDescriptor));

                        continue;
                    }

                    var descriptor = new PropertyInfoDescriptor(_scriptEngine, property, target);
                    yield return(new KeyValuePair <string, PropertyDescriptor>(property.Name, descriptor));
                }
                yield break;
            }

            // look for properties
            foreach (var property in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                if (property.CanRead == false)
                {
                    continue;
                }

                var descriptor = new PropertyInfoDescriptor(_scriptEngine, property, target);
                yield return(new KeyValuePair <string, PropertyDescriptor>(property.Name, descriptor));
            }

            // look for fields
            foreach (var field in type.GetFields(BindingFlags.Instance | BindingFlags.Public))
            {
                var descriptor = new FieldInfoDescriptor(_scriptEngine, field, target);
                yield return(new KeyValuePair <string, PropertyDescriptor>(field.Name, descriptor));
            }
        }
コード例 #2
0
        public override PropertyDescriptor GetOwnProperty(string propertyName)
        {
            PropertyDescriptor x;

            if (Properties.TryGetValue(propertyName, out x))
            {
                return(x);
            }

            var type = Target.GetType();

            // look for a property
            var property = type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public);

            if (property != null)
            {
                var descriptor = new PropertyInfoDescriptor(Engine, property, Target);
                Properties.Add(propertyName, descriptor);
                return(descriptor);
            }

            // look for a field
            var field = type.GetField(propertyName, BindingFlags.Instance | BindingFlags.Public);

            if (field != null)
            {
                var descriptor = new FieldInfoDescriptor(Engine, field, Target);
                Properties.Add(propertyName, descriptor);
                return(descriptor);
            }

            // if no properties were found then look for a method
            var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public)
                          .Where(m => m.Name == propertyName)
                          .ToArray();

            if (methods.Any())
            {
                return(new PropertyDescriptor(new MethodInfoFunctionInstance(Engine, methods), false, true, false));
            }

            // if no methods are found check if target implemented indexing
            if (type.GetProperties().Where(p => p.GetIndexParameters().Length != 0).FirstOrDefault() != null)
            {
                return(new IndexDescriptor(Engine, propertyName, Target));
            }

            return(PropertyDescriptor.Undefined);
        }
コード例 #3
0
        public override PropertyDescriptor GetOwnProperty(string propertyName)
        {
            PropertyDescriptor x;

            if (Properties.TryGetValue(propertyName, out x))
            {
                return(x);
            }

            var type = Target.GetType();

            // look for a property
            var property = type.GetProperties(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)
                           .Where(p => EqualsIgnoreCasing(p.Name, propertyName))
                           .FirstOrDefault();

            if (property != null)
            {
                var descriptor = new PropertyInfoDescriptor(Engine, property, Target);
                Properties.Add(propertyName, descriptor);
                return(descriptor);
            }

            // look for a field
            var field = type.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)
                        .Where(f => EqualsIgnoreCasing(f.Name, propertyName))
                        .FirstOrDefault();

            if (field != null)
            {
                var descriptor = new FieldInfoDescriptor(Engine, field, Target);
                Properties.Add(propertyName, descriptor);
                return(descriptor);
            }

            // if no properties were found then look for a method
            var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)
                          .Where(m => EqualsIgnoreCasing(m.Name, propertyName))
                          .ToArray();

            if (methods.Any())
            {
                var descriptor = new PropertyDescriptor(new MethodInfoFunctionInstance(Engine, methods), false, true, false);
                Properties.Add(propertyName, descriptor);
                return(descriptor);
            }

            // if no methods are found check if target implemented indexing
            if (type.GetProperties().Where(p => p.GetIndexParameters().Length != 0).FirstOrDefault() != null)
            {
                return(new IndexDescriptor(Engine, propertyName, Target));
            }

            var interfaces = type.GetInterfaces();

            // try to find a single explicit property implementation
            var explicitProperties = (from iface in interfaces
                                      from iprop in iface.GetProperties()
                                      where EqualsIgnoreCasing(iprop.Name, propertyName)
                                      select iprop).ToArray();

            if (explicitProperties.Length == 1)
            {
                var descriptor = new PropertyInfoDescriptor(Engine, explicitProperties[0], Target);
                Properties.Add(propertyName, descriptor);
                return(descriptor);
            }

            // try to find explicit method implementations
            var explicitMethods = (from iface in interfaces
                                   from imethod in iface.GetMethods()
                                   where EqualsIgnoreCasing(imethod.Name, propertyName)
                                   select imethod).ToArray();

            if (explicitMethods.Length > 0)
            {
                var descriptor = new PropertyDescriptor(new MethodInfoFunctionInstance(Engine, explicitMethods), false, true, false);
                Properties.Add(propertyName, descriptor);
                return(descriptor);
            }

            // try to find explicit indexer implementations
            var explicitIndexers =
                (from iface in interfaces
                 from iprop in iface.GetProperties()
                 where iprop.GetIndexParameters().Length != 0
                 select iprop).ToArray();

            if (explicitIndexers.Length == 1)
            {
                return(new IndexDescriptor(Engine, explicitIndexers[0].DeclaringType, propertyName, Target));
            }

            return(PropertyDescriptor.Undefined);
        }