Пример #1
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;
        }
Пример #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())
            {
                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 propertyName.Equals(iprop.Name)
                                      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 propertyName.Equals(imethod.Name)
                                   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;
        }