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 ConstructorInfo : MethodBase
32 // prevent external subclasses
33 internal ConstructorInfo()
37 public sealed override string ToString()
39 return GetMethodInfo().ToString();
42 public static readonly string ConstructorName = ".ctor";
43 public static readonly string TypeConstructorName = ".cctor";
45 internal abstract MethodInfo GetMethodInfo();
47 internal override MethodBase BindTypeParameters(Type type)
49 return new ConstructorInfoImpl((MethodInfo)GetMethodInfo().BindTypeParameters(type));
52 public sealed override MethodBase __GetMethodOnTypeDefinition()
54 return new ConstructorInfoImpl((MethodInfo)GetMethodInfo().__GetMethodOnTypeDefinition());
57 public sealed override MemberTypes MemberType
59 get { return MemberTypes.Constructor; }
62 public sealed override int __MethodRVA
64 get { return GetMethodInfo().__MethodRVA; }
67 public sealed override bool ContainsGenericParameters
69 get { return GetMethodInfo().ContainsGenericParameters; }
72 public ParameterInfo __ReturnParameter
74 get { return new ParameterInfoWrapper(this, GetMethodInfo().ReturnParameter); }
77 public sealed override ParameterInfo[] GetParameters()
79 ParameterInfo[] parameters = GetMethodInfo().GetParameters();
80 for (int i = 0; i < parameters.Length; i++)
82 parameters[i] = new ParameterInfoWrapper(this, parameters[i]);
87 public sealed override CallingConventions CallingConvention
89 get { return GetMethodInfo().CallingConvention; }
92 public sealed override MethodAttributes Attributes
94 get { return GetMethodInfo().Attributes; }
97 public sealed override MethodImplAttributes GetMethodImplementationFlags()
99 return GetMethodInfo().GetMethodImplementationFlags();
102 public sealed override Type DeclaringType
104 get { return GetMethodInfo().DeclaringType; }
107 public sealed override string Name
109 get { return GetMethodInfo().Name; }
112 public sealed override int MetadataToken
114 get { return GetMethodInfo().MetadataToken; }
117 public sealed override Module Module
119 get { return GetMethodInfo().Module; }
122 public sealed override MethodBody GetMethodBody()
124 return GetMethodInfo().GetMethodBody();
127 public sealed override bool __IsMissing
129 get { return GetMethodInfo().__IsMissing; }
132 internal sealed override int ParameterCount
134 get { return GetMethodInfo().ParameterCount; }
137 internal sealed override MemberInfo SetReflectedType(Type type)
139 return new ConstructorInfoWithReflectedType(type, this);
142 internal sealed override int GetCurrentToken()
144 return GetMethodInfo().GetCurrentToken();
147 internal sealed override List<CustomAttributeData> GetPseudoCustomAttributes(Type attributeType)
149 return GetMethodInfo().GetPseudoCustomAttributes(attributeType);
152 internal sealed override bool IsBaked
154 get { return GetMethodInfo().IsBaked; }
157 internal sealed override MethodSignature MethodSignature
159 get { return GetMethodInfo().MethodSignature; }
162 internal sealed override int ImportTo(Emit.ModuleBuilder module)
164 return GetMethodInfo().ImportTo(module);
168 sealed class ConstructorInfoImpl : ConstructorInfo
170 private readonly MethodInfo method;
172 internal ConstructorInfoImpl(MethodInfo method)
174 this.method = method;
177 public override bool Equals(object obj)
179 ConstructorInfoImpl other = obj as ConstructorInfoImpl;
180 return other != null && other.method.Equals(method);
183 public override int GetHashCode()
185 return method.GetHashCode();
188 internal override MethodInfo GetMethodInfo()
193 internal override MethodInfo GetMethodOnTypeDefinition()
195 return method.GetMethodOnTypeDefinition();
199 sealed class ConstructorInfoWithReflectedType : ConstructorInfo
201 private readonly Type reflectedType;
202 private readonly ConstructorInfo ctor;
204 internal ConstructorInfoWithReflectedType(Type reflectedType, ConstructorInfo ctor)
206 Debug.Assert(reflectedType != ctor.DeclaringType);
207 this.reflectedType = reflectedType;
211 public override bool Equals(object obj)
213 ConstructorInfoWithReflectedType other = obj as ConstructorInfoWithReflectedType;
215 && other.reflectedType == reflectedType
216 && other.ctor == ctor;
219 public override int GetHashCode()
221 return reflectedType.GetHashCode() ^ ctor.GetHashCode();
224 public override Type ReflectedType
226 get { return reflectedType; }
229 internal override MethodInfo GetMethodInfo()
231 return ctor.GetMethodInfo();
234 internal override MethodInfo GetMethodOnTypeDefinition()
236 return ctor.GetMethodOnTypeDefinition();