1 // 2 // System.Reflection/MonoEvent.cs 3 // 4 // Author: 5 // Paolo Molaro (lupus@ximian.com) 6 // 7 // (C) 2001 Ximian, Inc. http://www.ximian.com 8 // 9 10 // 11 // Copyright (C) 2004, 2009 Novell, Inc (http://www.novell.com) 12 // 13 // Permission is hereby granted, free of charge, to any person obtaining 14 // a copy of this software and associated documentation files (the 15 // "Software"), to deal in the Software without restriction, including 16 // without limitation the rights to use, copy, modify, merge, publish, 17 // distribute, sublicense, and/or sell copies of the Software, and to 18 // permit persons to whom the Software is furnished to do so, subject to 19 // the following conditions: 20 // 21 // The above copyright notice and this permission notice shall be 22 // included in all copies or substantial portions of the Software. 23 // 24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 // 32 33 using System; 34 using System.Collections.Generic; 35 using System.Reflection; 36 using System.Runtime.CompilerServices; 37 using System.Runtime.InteropServices; 38 using System.Runtime.Serialization; 39 using System.Diagnostics.Contracts; 40 41 namespace System.Reflection { 42 43 internal struct MonoEventInfo { 44 public Type declaring_type; 45 public Type reflected_type; 46 public String name; 47 public MethodInfo add_method; 48 public MethodInfo remove_method; 49 public MethodInfo raise_method; 50 public EventAttributes attrs; 51 public MethodInfo[] other_methods; 52 53 [MethodImplAttribute(MethodImplOptions.InternalCall)] get_event_infoSystem.Reflection.MonoEventInfo54 static extern void get_event_info (MonoEvent ev, out MonoEventInfo info); 55 GetEventInfoSystem.Reflection.MonoEventInfo56 internal static MonoEventInfo GetEventInfo (MonoEvent ev) 57 { 58 MonoEventInfo mei; 59 MonoEventInfo.get_event_info (ev, out mei); 60 return mei; 61 } 62 } 63 64 abstract class RuntimeEventInfo : EventInfo, ISerializable 65 { 66 internal BindingFlags BindingFlags { 67 get { 68 return 0; 69 } 70 } 71 72 public override Module Module { 73 get { 74 return GetRuntimeModule (); 75 } 76 } 77 GetDeclaringTypeInternal()78 internal RuntimeType GetDeclaringTypeInternal () 79 { 80 return (RuntimeType) DeclaringType; 81 } 82 83 RuntimeType ReflectedTypeInternal { 84 get { 85 return (RuntimeType) ReflectedType; 86 } 87 } 88 GetRuntimeModule()89 internal RuntimeModule GetRuntimeModule () 90 { 91 return GetDeclaringTypeInternal ().GetRuntimeModule (); 92 } 93 94 #region ISerializable GetObjectData(SerializationInfo info, StreamingContext context)95 public void GetObjectData(SerializationInfo info, StreamingContext context) 96 { 97 if (info == null) 98 throw new ArgumentNullException("info"); 99 Contract.EndContractBlock(); 100 101 MemberInfoSerializationHolder.GetSerializationInfo( 102 info, 103 Name, 104 ReflectedTypeInternal, 105 null, 106 MemberTypes.Event); 107 } 108 #endregion 109 } 110 111 [Serializable] 112 [StructLayout (LayoutKind.Sequential)] 113 internal sealed class MonoEvent: RuntimeEventInfo 114 { 115 #pragma warning disable 169 116 IntPtr klass; 117 IntPtr handle; 118 #pragma warning restore 169 119 120 public override EventAttributes Attributes { 121 get { 122 return MonoEventInfo.GetEventInfo (this).attrs; 123 } 124 } 125 GetAddMethod(bool nonPublic)126 public override MethodInfo GetAddMethod (bool nonPublic) 127 { 128 MonoEventInfo info = MonoEventInfo.GetEventInfo (this); 129 if (nonPublic || (info.add_method != null && info.add_method.IsPublic)) 130 return info.add_method; 131 return null; 132 } 133 GetRaiseMethod(bool nonPublic)134 public override MethodInfo GetRaiseMethod (bool nonPublic) 135 { 136 MonoEventInfo info = MonoEventInfo.GetEventInfo (this); 137 if (nonPublic || (info.raise_method != null && info.raise_method.IsPublic)) 138 return info.raise_method; 139 return null; 140 } 141 GetRemoveMethod(bool nonPublic)142 public override MethodInfo GetRemoveMethod (bool nonPublic) 143 { 144 MonoEventInfo info = MonoEventInfo.GetEventInfo (this); 145 if (nonPublic || (info.remove_method != null && info.remove_method.IsPublic)) 146 return info.remove_method; 147 return null; 148 } 149 GetOtherMethods(bool nonPublic)150 public override MethodInfo[] GetOtherMethods (bool nonPublic) 151 { 152 MonoEventInfo info = MonoEventInfo.GetEventInfo (this); 153 if (nonPublic) 154 return info.other_methods; 155 int num_public = 0; 156 foreach (MethodInfo m in info.other_methods) { 157 if (m.IsPublic) 158 num_public++; 159 } 160 if (num_public == info.other_methods.Length) 161 return info.other_methods; 162 MethodInfo[] res = new MethodInfo [num_public]; 163 num_public = 0; 164 foreach (MethodInfo m in info.other_methods) { 165 if (m.IsPublic) 166 res [num_public++] = m; 167 } 168 return res; 169 } 170 171 public override Type DeclaringType { 172 get { 173 return MonoEventInfo.GetEventInfo (this).declaring_type; 174 } 175 } 176 177 public override Type ReflectedType { 178 get { 179 return MonoEventInfo.GetEventInfo (this).reflected_type; 180 } 181 } 182 183 public override string Name { 184 get { 185 return MonoEventInfo.GetEventInfo (this).name; 186 } 187 } 188 ToString()189 public override string ToString () 190 { 191 return EventHandlerType + " " + Name; 192 } 193 IsDefined(Type attributeType, bool inherit)194 public override bool IsDefined (Type attributeType, bool inherit) 195 { 196 return MonoCustomAttrs.IsDefined (this, attributeType, inherit); 197 } 198 GetCustomAttributes( bool inherit)199 public override object[] GetCustomAttributes( bool inherit) 200 { 201 return MonoCustomAttrs.GetCustomAttributes (this, inherit); 202 } 203 GetCustomAttributes( Type attributeType, bool inherit)204 public override object[] GetCustomAttributes( Type attributeType, bool inherit) 205 { 206 return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit); 207 } 208 GetCustomAttributesData()209 public override IList<CustomAttributeData> GetCustomAttributesData () { 210 return CustomAttributeData.GetCustomAttributes (this); 211 } 212 } 213 } 214