Esempio n. 1
0
        // Invoke a member.
        public override Object InvokeMember
            (String name, BindingFlags invokeAttr,
            Binder binder, Object target, Object[] args,
            ParameterModifier[] modifiers,
            CultureInfo culture, String[] namedParameters)
        {
            MemberInfo  member;
            MemberTypes types;
            MemberTypes otherTypes = (MemberTypes)0;

            Type[] argTypes;

            // Validate the parameters against the invocation type.
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            // Specification say that if type of look up is absent
            // the lookup is treated as Public Instance by default
            if ((invokeAttr & BindingFlags.NonPublic) == 0)
            {
                invokeAttr |= BindingFlags.Public;
            }
            if ((invokeAttr & BindingFlags.Static) == 0)
            {
                invokeAttr |= BindingFlags.Instance;
            }

            if ((invokeAttr & BindingFlags.CreateInstance) != 0)
            {
                if ((invokeAttr & (BindingFlags.InvokeMethod |
                                   BindingFlags.GetField |
                                   BindingFlags.SetField |
                                   BindingFlags.GetProperty |
                                   BindingFlags.SetProperty)) != 0)
                {
                    throw new ArgumentException
                              (_("Reflection_InvokeAttr"));
                }
                types       = MemberTypes.Constructor;
                invokeAttr |= BindingFlags.DeclaredOnly;
                name        = ".ctor";
                if (target != null)
                {
                    throw new TargetException(_("Reflection_CtorTarget"));
                }
                argTypes = ArgsToTypes(args);
            }
            else if ((invokeAttr & BindingFlags.InvokeMethod) != 0)
            {
                if ((invokeAttr & (BindingFlags.SetField |
                                   BindingFlags.SetProperty)) != 0)
                {
                    throw new ArgumentException
                              (_("Reflection_InvokeAttr"));
                }
                types    = MemberTypes.Method;
                argTypes = ArgsToTypes(args);
            }
            else if ((invokeAttr & BindingFlags.GetField) != 0)
            {
                if ((invokeAttr & (BindingFlags.SetField |
                                   BindingFlags.SetProperty)) != 0)
                {
                    throw new ArgumentException
                              (_("Reflection_InvokeAttr"));
                }
                if ((invokeAttr & BindingFlags.GetProperty) != 0)
                {
                    // It is possible for callers to ask for
                    // "either a field or a property with this name".
                    otherTypes = MemberTypes.Property;
                }
                types = MemberTypes.Field;
                if (args != null && args.Length != 0)
                {
                    throw new ArgumentException
                              (_("Reflection_GetField"));
                }
                argTypes = null;
            }
            else if ((invokeAttr & BindingFlags.SetField) != 0)
            {
                if ((invokeAttr & (BindingFlags.GetField |
                                   BindingFlags.GetProperty)) != 0)
                {
                    throw new ArgumentException
                              (_("Reflection_InvokeAttr"));
                }
                if ((invokeAttr & BindingFlags.SetProperty) != 0)
                {
                    // It is possible for callers to ask for
                    // "either a field or a property with this name".
                    otherTypes = MemberTypes.Property;
                }
                types = MemberTypes.Field;
                if (args == null || args.Length != 1)
                {
                    throw new ArgumentException
                              (_("Reflection_SetField"));
                }
                argTypes = null;
            }
            else if ((invokeAttr & BindingFlags.GetProperty) != 0)
            {
                if ((invokeAttr & BindingFlags.SetProperty) != 0)
                {
                    throw new ArgumentException
                              (_("Reflection_InvokeAttr"));
                }
                types    = MemberTypes.Property;
                argTypes = ArgsToTypes(args);
            }
            else if ((invokeAttr & BindingFlags.SetProperty) != 0)
            {
                if ((invokeAttr & BindingFlags.GetProperty) != 0)
                {
                    throw new ArgumentException
                              (_("Reflection_InvokeAttr"));
                }
                types    = MemberTypes.Property;
                argTypes = ArgsToTypes(args);
            }
            else
            {
                throw new ArgumentException
                          (_("Reflection_InvokeAttr"));
            }

            // Get the default member name if necessary.
            if (name == String.Empty &&
                Attribute.IsDefined(this, typeof(DefaultMemberAttribute)))
            {
                DefaultMemberAttribute attr =
                    (DefaultMemberAttribute)
                    Attribute.GetCustomAttribute
                        (this, typeof(DefaultMemberAttribute));
                name = attr.MemberName;
            }

            // Get the member from the type.
            member = GetMemberImpl(name, types, invokeAttr, binder,
                                   CallingConventions.Any,
                                   argTypes, modifiers);
            if (member == null && otherTypes != (MemberTypes)0)
            {
                types  = otherTypes;
                member = GetMemberImpl(name, types, invokeAttr, binder,
                                       CallingConventions.Any,
                                       argTypes, modifiers);
            }
            if (member == null)
            {
                if (types == MemberTypes.Field)
                {
                    throw new MissingFieldException
                              (_("Reflection_MissingField"));
                }
                else if (types == MemberTypes.Property)
                {
                    throw new MissingFieldException
                              (_("Reflection_MissingProperty"));
                }
                else
                {
                    throw new MissingMethodException
                              (_("Reflection_MissingMethod"));
                }
            }

            // Invoke the member.
            if (types == MemberTypes.Constructor)
            {
                // Invoke a constructor.
                if (namedParameters != null)
                {
                    args = RepackArgs(args, namedParameters,
                                      ((ConstructorInfo)member).GetParameters());
                }
                return(((ConstructorInfo)member).Invoke
                           (invokeAttr, binder, args, culture));
            }
            else if (types == MemberTypes.Method)
            {
                // Invoke a method.
                if (namedParameters != null)
                {
                    args = RepackArgs(args, namedParameters,
                                      ((MethodInfo)member).GetParameters());
                }
                return(((MethodInfo)member).Invoke
                           (target, invokeAttr, binder, args, culture));
            }
            else if (types == MemberTypes.Field)
            {
                // Invoke a field.
                if ((invokeAttr & BindingFlags.GetField) != 0)
                {
                    // Get the value of a field.
                    return(((FieldInfo)member).GetValue(target));
                }
                else
                {
                    // Set the value of a field.
                    ((FieldInfo)member).SetValue(target, args[0],
                                                 invokeAttr, binder,
                                                 culture);
                    return(null);
                }
            }
            else
            {
                // Invoke a property.
                if ((invokeAttr & BindingFlags.GetProperty) != 0)
                {
                    // Get the value of a property.
                    if (namedParameters != null)
                    {
                        args = RepackArgs(args, namedParameters,
                                          ((PropertyInfo)member).GetIndexParameters());
                    }
                    return(((PropertyInfo)member).GetValue
                               (target, invokeAttr, binder, args, culture));
                }
                else
                {
                    // Set the value of a property.
                    MethodInfo setter;
                    setter = ((PropertyInfo)member).GetSetMethod();
                    if (setter == null)
                    {
                        throw new MissingMethodException
                                  (_("Reflection_NoPropertySet"));
                    }
                    if (namedParameters != null)
                    {
                        args = RepackArgs(args, namedParameters,
                                          setter.GetParameters());
                    }
                    return(setter.Invoke(target, invokeAttr, binder,
                                         args, culture));
                }
            }
        }
Esempio n. 2
0
 AttributeCollection ICustomTypeDescriptor.GetAttributes ()
 {
         object value = _staticAttributeCollection;
         if (value == null) {
                 CLSCompliantAttribute clsAttr = new CLSCompliantAttribute (true);
                 DefaultMemberAttribute defMemAttr = new DefaultMemberAttribute ("Item");
                 Attribute [] attrs = {clsAttr, defMemAttr};
                 value = new AttributeCollection (attrs);
         }
         System.Threading.Interlocked.CompareExchange (ref _staticAttributeCollection, value, null);
         return _staticAttributeCollection as AttributeCollection;
 }