24using System.Collections.Generic;
25using System.Reflection.Metadata.Ecma335;
32 internal sealed class EventBuilder :
EventInfo
38 internal short Semantics;
39 internal MethodBuilder Method;
43 readonly TypeBuilder typeBuilder;
45 EventAttributes attributes;
46 readonly
int eventType;
47 MethodBuilder addOnMethod;
48 MethodBuilder removeOnMethod;
49 MethodBuilder fireMethod;
50 readonly List<Accessor> accessors =
new List<Accessor>();
60 internal EventBuilder(TypeBuilder typeBuilder,
string name, EventAttributes attributes,
Type eventtype)
62 this.typeBuilder = typeBuilder;
64 this.attributes = attributes;
65 this.eventType = typeBuilder.ModuleBuilder.GetTypeTokenForMemberRef(eventtype);
68 public void SetAddOnMethod(MethodBuilder mdBuilder)
70 addOnMethod = mdBuilder;
71 var acc =
new Accessor();
73 acc.Method = mdBuilder;
77 public void SetRemoveOnMethod(MethodBuilder mdBuilder)
79 removeOnMethod = mdBuilder;
80 var acc =
new Accessor();
82 acc.Method = mdBuilder;
86 public void SetRaiseMethod(MethodBuilder mdBuilder)
88 fireMethod = mdBuilder;
89 var acc =
new Accessor();
91 acc.Method = mdBuilder;
95 public void AddOtherMethod(MethodBuilder mdBuilder)
97 var acc =
new Accessor();
99 acc.Method = mdBuilder;
103 public void SetCustomAttribute(
ConstructorInfo con,
byte[] binaryAttribute)
105 SetCustomAttribute(
new CustomAttributeBuilder(con, binaryAttribute));
108 public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
110 if (customBuilder.KnownCA ==
KnownCA.SpecialNameAttribute)
112 attributes |= EventAttributes.SpecialName;
116 if (lazyPseudoToken == 0)
117 lazyPseudoToken = typeBuilder.ModuleBuilder.AllocPseudoToken();
119 typeBuilder.ModuleBuilder.SetCustomAttribute(lazyPseudoToken, customBuilder);
123 public override EventAttributes Attributes
125 get {
return attributes; }
128 public override MethodInfo GetAddMethod(
bool nonPublic)
130 return nonPublic || (addOnMethod !=
null && addOnMethod.IsPublic) ? addOnMethod : null;
133 public override MethodInfo GetRemoveMethod(
bool nonPublic)
135 return nonPublic || (removeOnMethod !=
null && removeOnMethod.IsPublic) ? removeOnMethod : null;
138 public override MethodInfo GetRaiseMethod(
bool nonPublic)
140 return nonPublic || (fireMethod !=
null && fireMethod.IsPublic) ? fireMethod : null;
143 public override MethodInfo[] GetOtherMethods(
bool nonPublic)
145 var list =
new List<MethodInfo>();
146 foreach (var acc
in accessors)
148 list.Add(acc.Method);
150 return list.ToArray();
155 List<MethodInfo> list =
new List<MethodInfo>();
156 foreach (Accessor acc
in accessors)
158 list.Add(acc.Method);
160 return list.ToArray();
163 public override Type DeclaringType
165 get {
return typeBuilder; }
168 public override string Name
175 get {
return typeBuilder.ModuleBuilder; }
178 public EventToken GetEventToken()
180 if (lazyPseudoToken == 0)
181 lazyPseudoToken = typeBuilder.ModuleBuilder.AllocPseudoToken();
183 return new EventToken(lazyPseudoToken);
186 public override Type EventHandlerType
188 get {
return typeBuilder.ModuleBuilder.ResolveType(eventType); }
194 rec.EventFlags = (short)attributes;
195 rec.Name = typeBuilder.ModuleBuilder.GetOrAddString(name);
196 rec.EventType = eventType;
198 var token = MetadataTokens.GetToken(MetadataTokens.EventDefinitionHandle(typeBuilder.ModuleBuilder.EventTable.AddRecord(rec)));
199 if (lazyPseudoToken == 0)
200 lazyPseudoToken = token;
202 typeBuilder.ModuleBuilder.RegisterTokenFixup(lazyPseudoToken, token);
204 foreach (var acc
in accessors)
205 AddMethodSemantics(acc.Semantics, acc.Method.MetadataToken, token);
208 void AddMethodSemantics(
short semantics,
int methodToken,
int propertyToken)
211 rec.Semantics = semantics;
212 rec.Method = methodToken;
213 rec.Association = propertyToken;
214 typeBuilder.ModuleBuilder.MethodSemanticsTable.AddRecord(rec);
217 internal override bool IsPublic
221 foreach (Accessor acc
in accessors)
223 if (acc.Method.IsPublic)
232 internal override bool IsNonPrivate
236 foreach (Accessor acc
in accessors)
238 if ((acc.Method.Attributes & MethodAttributes.MemberAccessMask) > MethodAttributes.Private)
247 internal override bool IsStatic
251 foreach (Accessor acc
in accessors)
253 if (acc.Method.IsStatic)
262 internal override bool IsBaked
264 get {
return typeBuilder.IsBaked; }
267 internal override int GetCurrentToken()
269 if (typeBuilder.ModuleBuilder.IsSaved && ModuleBuilder.IsPseudoToken(lazyPseudoToken))
271 return typeBuilder.ModuleBuilder.ResolvePseudoToken(lazyPseudoToken);
275 return lazyPseudoToken;
IKVM.Reflection.Module Module
IKVM.Reflection.Type Type
IKVM.Reflection.ConstructorInfo ConstructorInfo
IKVM.Reflection.EventInfo EventInfo
IKVM.Reflection.MethodInfo MethodInfo
global::java.lang.invoke.LambdaForm.Name Name
KnownCA
These are the pseudo-custom attributes that are recognized by name by the runtime (i....