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)); } }
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); }
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); }