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.
25
using System.Collections.Generic;
26
using System.Diagnostics;
28
namespace IKVM.Reflection
30
public abstract class FieldInfo : MemberInfo
32
// prevent external subclasses
37
public sealed override MemberTypes MemberType
39
get { return MemberTypes.Field; }
42
public abstract FieldAttributes Attributes { get; }
43
public abstract void __GetDataFromRVA(byte[] data, int offset, int length);
44
public abstract int __FieldRVA { get; }
45
public abstract Object GetRawConstantValue();
46
internal abstract FieldSignature FieldSignature { get; }
50
get { return this.FieldSignature.FieldType; }
53
public CustomModifiers __GetCustomModifiers()
55
return this.FieldSignature.GetCustomModifiers();
58
public Type[] GetOptionalCustomModifiers()
60
return __GetCustomModifiers().GetOptional();
63
public Type[] GetRequiredCustomModifiers()
65
return __GetCustomModifiers().GetRequired();
70
get { return (Attributes & FieldAttributes.Static) != 0; }
75
get { return (Attributes & FieldAttributes.Literal) != 0; }
78
public bool IsInitOnly
80
get { return (Attributes & FieldAttributes.InitOnly) != 0; }
83
public bool IsNotSerialized
85
get { return (Attributes & FieldAttributes.NotSerialized) != 0; }
88
public bool IsSpecialName
90
get { return (Attributes & FieldAttributes.SpecialName) != 0; }
95
get { return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Public; }
100
get { return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Private; }
105
get { return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Family; }
108
public bool IsFamilyOrAssembly
110
get { return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamORAssem; }
113
public bool IsAssembly
115
get { return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Assembly; }
118
public bool IsFamilyAndAssembly
120
get { return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamANDAssem; }
123
public bool IsPinvokeImpl
125
get { return (Attributes & FieldAttributes.PinvokeImpl) != 0; }
128
public virtual FieldInfo __GetFieldOnTypeDefinition()
133
public abstract bool __TryGetFieldOffset(out int offset);
135
public bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal)
137
return FieldMarshal.ReadFieldMarshal(this.Module, GetCurrentToken(), out fieldMarshal);
140
internal abstract int ImportTo(Emit.ModuleBuilder module);
142
internal virtual FieldInfo BindTypeParameters(Type type)
144
return new GenericFieldInstance(this.DeclaringType.BindTypeParameters(type), this);
147
internal sealed override bool BindingFlagsMatch(BindingFlags flags)
149
return BindingFlagsMatch(IsPublic, flags, BindingFlags.Public, BindingFlags.NonPublic)
150
&& BindingFlagsMatch(IsStatic, flags, BindingFlags.Static, BindingFlags.Instance);
153
internal sealed override bool BindingFlagsMatchInherited(BindingFlags flags)
155
return (Attributes & FieldAttributes.FieldAccessMask) > FieldAttributes.Private
156
&& BindingFlagsMatch(IsPublic, flags, BindingFlags.Public, BindingFlags.NonPublic)
157
&& BindingFlagsMatch(IsStatic, flags, BindingFlags.Static | BindingFlags.FlattenHierarchy, BindingFlags.Instance);
160
internal sealed override MemberInfo SetReflectedType(Type type)
162
return new FieldInfoWithReflectedType(type, this);
165
internal sealed override List<CustomAttributeData> GetPseudoCustomAttributes(Type attributeType)
167
Module module = this.Module;
168
List<CustomAttributeData> list = new List<CustomAttributeData>();
169
if (attributeType == null || attributeType.IsAssignableFrom(module.universe.System_Runtime_InteropServices_MarshalAsAttribute))
172
if (__TryGetFieldMarshal(out spec))
174
list.Add(CustomAttributeData.CreateMarshalAsPseudoCustomAttribute(module, spec));
177
if (attributeType == null || attributeType.IsAssignableFrom(module.universe.System_Runtime_InteropServices_FieldOffsetAttribute))
180
if (__TryGetFieldOffset(out offset))
182
list.Add(CustomAttributeData.CreateFieldOffsetPseudoCustomAttribute(module, offset));
189
sealed class FieldInfoWithReflectedType : FieldInfo
191
private readonly Type reflectedType;
192
private readonly FieldInfo field;
194
internal FieldInfoWithReflectedType(Type reflectedType, FieldInfo field)
196
Debug.Assert(reflectedType != field.DeclaringType);
197
this.reflectedType = reflectedType;
201
public override FieldAttributes Attributes
203
get { return field.Attributes; }
206
public override void __GetDataFromRVA(byte[] data, int offset, int length)
208
field.__GetDataFromRVA(data, offset, length);
211
public override int __FieldRVA
213
get { return field.__FieldRVA; }
216
public override bool __TryGetFieldOffset(out int offset)
218
return field.__TryGetFieldOffset(out offset);
221
public override Object GetRawConstantValue()
223
return field.GetRawConstantValue();
226
internal override FieldSignature FieldSignature
228
get { return field.FieldSignature; }
231
public override FieldInfo __GetFieldOnTypeDefinition()
233
return field.__GetFieldOnTypeDefinition();
236
internal override int ImportTo(Emit.ModuleBuilder module)
238
return field.ImportTo(module);
241
internal override FieldInfo BindTypeParameters(Type type)
243
return field.BindTypeParameters(type);
246
public override bool __IsMissing
248
get { return field.__IsMissing; }
251
public override Type DeclaringType
253
get { return field.DeclaringType; }
256
public override Type ReflectedType
258
get { return reflectedType; }
261
public override bool Equals(object obj)
263
FieldInfoWithReflectedType other = obj as FieldInfoWithReflectedType;
265
&& other.reflectedType == reflectedType
266
&& other.field == field;
269
public override int GetHashCode()
271
return reflectedType.GetHashCode() ^ field.GetHashCode();
274
public override int MetadataToken
276
get { return field.MetadataToken; }
279
public override Module Module
281
get { return field.Module; }
284
public override string Name
286
get { return field.Name; }
289
public override string ToString()
291
return field.ToString();
294
internal override int GetCurrentToken()
296
return field.GetCurrentToken();
299
internal override bool IsBaked
301
get { return field.IsBaked; }