25using System.Collections.Generic;
26using System.Reflection.Metadata.Ecma335;
36 readonly TypeBuilder typeBuilder;
38 PropertyAttributes attributes;
42 readonly List<Accessor> accessors =
new List<Accessor>();
44 bool patchCallingConvention;
49 internal short Semantics;
50 internal MethodBuilder Method;
62 internal PropertyBuilder(TypeBuilder typeBuilder,
string name, PropertyAttributes attributes,
PropertySignature sig,
bool patchCallingConvention)
64 this.typeBuilder = typeBuilder;
66 this.attributes = attributes;
68 this.patchCallingConvention = patchCallingConvention;
76 public void SetGetMethod(MethodBuilder mdBuilder)
81 acc.Method = mdBuilder;
85 public void SetSetMethod(MethodBuilder mdBuilder)
90 acc.Method = mdBuilder;
94 public void AddOtherMethod(MethodBuilder mdBuilder)
98 acc.Method = mdBuilder;
102 public void SetCustomAttribute(
ConstructorInfo con,
byte[] binaryAttribute)
104 SetCustomAttribute(
new CustomAttributeBuilder(con, binaryAttribute));
107 public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
109 if (customBuilder.KnownCA ==
KnownCA.SpecialNameAttribute)
111 attributes |= PropertyAttributes.SpecialName;
115 if (lazyPseudoToken == 0)
116 lazyPseudoToken = typeBuilder.ModuleBuilder.AllocPseudoToken();
118 typeBuilder.ModuleBuilder.SetCustomAttribute(lazyPseudoToken, customBuilder);
122 public override object GetRawConstantValue()
124 if (lazyPseudoToken != 0)
125 return typeBuilder.ModuleBuilder.ConstantTable.GetRawConstantValue(typeBuilder.ModuleBuilder, lazyPseudoToken);
127 throw new InvalidOperationException();
130 public override PropertyAttributes Attributes
132 get {
return attributes; }
135 public override bool CanRead
137 get {
return getter !=
null; }
140 public override bool CanWrite
142 get {
return setter !=
null; }
145 public override MethodInfo GetGetMethod(
bool nonPublic)
147 return nonPublic || (getter !=
null && getter.IsPublic) ? getter : null;
150 public override MethodInfo GetSetMethod(
bool nonPublic)
152 return nonPublic || (setter !=
null && setter.IsPublic) ? setter : null;
155 public override MethodInfo[] GetAccessors(
bool nonPublic)
157 var list =
new List<MethodInfo>();
158 foreach (var acc
in accessors)
159 AddAccessor(list, nonPublic, acc.Method);
161 return list.ToArray();
164 static void AddAccessor(List<MethodInfo> list,
bool nonPublic,
MethodInfo method)
166 if (method !=
null && (nonPublic || method.IsPublic))
170 public override Type DeclaringType
172 get {
return typeBuilder; }
175 public override string Name
182 get {
return typeBuilder.Module; }
185 public void SetConstant(
object defaultValue)
187 if (lazyPseudoToken == 0)
188 lazyPseudoToken = typeBuilder.ModuleBuilder.AllocPseudoToken();
190 attributes |= PropertyAttributes.HasDefault;
191 typeBuilder.ModuleBuilder.AddConstant(lazyPseudoToken, defaultValue);
196 if (patchCallingConvention)
197 sig.HasThis = !this.IsStatic;
200 rec.Flags = (short)attributes;
201 rec.Name = typeBuilder.ModuleBuilder.GetOrAddString(name);
202 rec.Type = typeBuilder.ModuleBuilder.GetSignatureBlobIndex(sig);
203 int token = MetadataTokens.GetToken(MetadataTokens.PropertyDefinitionHandle(typeBuilder.ModuleBuilder.PropertyTable.AddRecord(rec)));
205 if (lazyPseudoToken == 0)
206 lazyPseudoToken = token;
208 typeBuilder.ModuleBuilder.RegisterTokenFixup(lazyPseudoToken, token);
210 foreach (var acc
in accessors)
211 AddMethodSemantics(acc.Semantics, acc.Method.MetadataToken, token);
214 void AddMethodSemantics(
short semantics,
int methodToken,
int propertyToken)
217 rec.Semantics = semantics;
218 rec.Method = methodToken;
219 rec.Association = propertyToken;
220 typeBuilder.ModuleBuilder.MethodSemanticsTable.AddRecord(rec);
223 internal override bool IsPublic
227 foreach (var acc
in accessors)
228 if (acc.Method.IsPublic)
235 internal override bool IsNonPrivate
239 foreach (var acc
in accessors)
240 if ((acc.Method.Attributes & MethodAttributes.MemberAccessMask) > MethodAttributes.Private)
247 internal override bool IsStatic
251 foreach (var acc
in accessors)
252 if (acc.Method.IsStatic)
259 internal override bool IsBaked
261 get {
return typeBuilder.IsBaked; }
264 internal override int GetCurrentToken()
266 if (typeBuilder.ModuleBuilder.IsSaved && ModuleBuilder.IsPseudoToken(lazyPseudoToken))
267 return typeBuilder.ModuleBuilder.ResolvePseudoToken(lazyPseudoToken);
269 return lazyPseudoToken;
272 public override int MetadataToken
276 if (lazyPseudoToken == 0)
277 lazyPseudoToken = typeBuilder.ModuleBuilder.AllocPseudoToken();
279 return GetCurrentToken();
IKVM.Reflection.Module Module
IKVM.Reflection.Type Type
IKVM.Reflection.ConstructorInfo ConstructorInfo
IKVM.Reflection.PropertyInfo PropertyInfo
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....