2
Copyright (C) 2009-2012 Jeroen Frijters
4
This software is provided 'as-is', without any express or implied
5
warranty. In no event will the authors be held liable for any damages
6
arising from the use of this software.
8
Permission is granted to anyone to use this software for any purpose,
9
including commercial applications, and to alter it and redistribute it
10
freely, subject to the following restrictions:
12
1. The origin of this software must not be misrepresented; you must not
13
claim that you wrote the original software. If you use this software
14
in a product, an acknowledgment in the product documentation would be
15
appreciated but is not required.
16
2. Altered source versions must be plainly marked as such, and must not be
17
misrepresented as being the original software.
18
3. This notice may not be removed or altered from any source distribution.
24
using System.Collections.Generic;
25
using System.Diagnostics;
27
namespace IKVM.Reflection
29
public abstract class EventInfo : MemberInfo
31
// prevent external subclasses
36
public sealed override MemberTypes MemberType
38
get { return MemberTypes.Event; }
41
public abstract EventAttributes Attributes { get; }
42
public abstract MethodInfo GetAddMethod(bool nonPublic);
43
public abstract MethodInfo GetRaiseMethod(bool nonPublic);
44
public abstract MethodInfo GetRemoveMethod(bool nonPublic);
45
public abstract MethodInfo[] GetOtherMethods(bool nonPublic);
46
public abstract MethodInfo[] __GetMethods();
47
public abstract Type EventHandlerType { get; }
48
internal abstract bool IsPublic { get; }
49
internal abstract bool IsNonPrivate { get; }
50
internal abstract bool IsStatic { get; }
52
public bool IsSpecialName
54
get { return (Attributes & EventAttributes.SpecialName) != 0; }
57
public MethodInfo GetAddMethod()
59
return GetAddMethod(false);
62
public MethodInfo GetRaiseMethod()
64
return GetRaiseMethod(false);
67
public MethodInfo GetRemoveMethod()
69
return GetRemoveMethod(false);
72
public MethodInfo[] GetOtherMethods()
74
return GetOtherMethods(false);
77
public MethodInfo AddMethod
79
get { return GetAddMethod(true); }
82
public MethodInfo RaiseMethod
84
get { return GetRaiseMethod(true); }
87
public MethodInfo RemoveMethod
89
get { return GetRemoveMethod(true); }
92
internal virtual EventInfo BindTypeParameters(Type type)
94
return new GenericEventInfo(this.DeclaringType.BindTypeParameters(type), this);
97
public override string ToString()
99
return this.DeclaringType.ToString() + " " + Name;
102
internal sealed override bool BindingFlagsMatch(BindingFlags flags)
104
return BindingFlagsMatch(IsPublic, flags, BindingFlags.Public, BindingFlags.NonPublic)
105
&& BindingFlagsMatch(IsStatic, flags, BindingFlags.Static, BindingFlags.Instance);
108
internal sealed override bool BindingFlagsMatchInherited(BindingFlags flags)
111
&& BindingFlagsMatch(IsPublic, flags, BindingFlags.Public, BindingFlags.NonPublic)
112
&& BindingFlagsMatch(IsStatic, flags, BindingFlags.Static | BindingFlags.FlattenHierarchy, BindingFlags.Instance);
115
internal sealed override MemberInfo SetReflectedType(Type type)
117
return new EventInfoWithReflectedType(type, this);
120
internal sealed override List<CustomAttributeData> GetPseudoCustomAttributes(Type attributeType)
122
// events don't have pseudo custom attributes
127
sealed class EventInfoWithReflectedType : EventInfo
129
private readonly Type reflectedType;
130
private readonly EventInfo eventInfo;
132
internal EventInfoWithReflectedType(Type reflectedType, EventInfo eventInfo)
134
Debug.Assert(reflectedType != eventInfo.DeclaringType);
135
this.reflectedType = reflectedType;
136
this.eventInfo = eventInfo;
139
public override EventAttributes Attributes
141
get { return eventInfo.Attributes; }
144
public override MethodInfo GetAddMethod(bool nonPublic)
146
return SetReflectedType(eventInfo.GetAddMethod(nonPublic), reflectedType);
149
public override MethodInfo GetRaiseMethod(bool nonPublic)
151
return SetReflectedType(eventInfo.GetRaiseMethod(nonPublic), reflectedType);
154
public override MethodInfo GetRemoveMethod(bool nonPublic)
156
return SetReflectedType(eventInfo.GetRemoveMethod(nonPublic), reflectedType);
159
public override MethodInfo[] GetOtherMethods(bool nonPublic)
161
return SetReflectedType(eventInfo.GetOtherMethods(nonPublic), reflectedType);
164
public override MethodInfo[] __GetMethods()
166
return SetReflectedType(eventInfo.__GetMethods(), reflectedType);
169
public override Type EventHandlerType
171
get { return eventInfo.EventHandlerType; }
174
internal override bool IsPublic
176
get { return eventInfo.IsPublic; }
179
internal override bool IsNonPrivate
181
get { return eventInfo.IsNonPrivate; }
184
internal override bool IsStatic
186
get { return eventInfo.IsStatic; }
189
internal override EventInfo BindTypeParameters(Type type)
191
return eventInfo.BindTypeParameters(type);
194
public override string ToString()
196
return eventInfo.ToString();
199
public override bool __IsMissing
201
get { return eventInfo.__IsMissing; }
204
public override Type DeclaringType
206
get { return eventInfo.DeclaringType; }
209
public override Type ReflectedType
211
get { return reflectedType; }
214
public override bool Equals(object obj)
216
EventInfoWithReflectedType other = obj as EventInfoWithReflectedType;
218
&& other.reflectedType == reflectedType
219
&& other.eventInfo == eventInfo;
222
public override int GetHashCode()
224
return reflectedType.GetHashCode() ^ eventInfo.GetHashCode();
227
public override int MetadataToken
229
get { return eventInfo.MetadataToken; }
232
public override Module Module
234
get { return eventInfo.Module; }
237
public override string Name
239
get { return eventInfo.Name; }
242
internal override bool IsBaked
244
get { return eventInfo.IsBaked; }
247
internal override int GetCurrentToken()
249
return eventInfo.GetCurrentToken();