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