+ this.MetaInfo = info;
+ this.parameters = parameters;
+ }
+
+ public override Type DeclaringType {
+ get {
+ return MetaInfo.DeclaringType;
+ }
+ }
+
+ public Type[] GetGenericArguments ()
+ {
+ return MetaInfo.GetGenericArguments ();
+ }
+
+ public MethodSpec Inflate (Type[] targs)
+ {
+ // TODO: Only create MethodSpec and inflate parameters, defer the call for later
+ var mb = ((IGenericMethodDefinition) definition).MakeGenericMethod (targs);
+
+ // TODO: Does not work on .NET
+ var par = TypeManager.GetParameterData (mb);
+
+ return new MethodSpec (Kind, definition, mb, par, Modifiers);
+ }
+
+ public bool IsAbstract {
+ get {
+ return (Modifiers & Modifiers.ABSTRACT) != 0;
+ }
+ }
+
+ public bool IsConstructor {
+ get {
+ return MetaInfo.IsConstructor;
+ }
+ }
+
+ public bool IsGenericMethod {
+ get {
+ return MetaInfo.IsGenericMethod;
+ }
+ }
+
+ // When is virtual or abstract
+ public bool IsVirtual {
+ get {
+ return (Modifiers & (Modifiers.VIRTUAL | Modifiers.ABSTRACT | Modifiers.OVERRIDE)) != 0;
+ }
+ }
+
+ public MethodBase MetaInfo {
+ get {
+ return metaInfo;
+ }
+ set {
+ metaInfo = value;
+ }
+ }
+
+ public AParametersCollection Parameters {
+ get { return parameters; }
+ }
+
+ public Type ReturnType {
+ get {
+ return IsConstructor ?
+ TypeManager.void_type : ((MethodInfo) MetaInfo).ReturnType;
+ }