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; }