//
// (C) 2001 Ximian, Inc. http://www.ximian.com
// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+// Copyright 2011 Xamarin Inc (http://www.xamarin.com).
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
using System.Diagnostics;
using System.Globalization;
+#if !FULL_AOT_RUNTIME
using System.Reflection.Emit;
+#endif
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace System.Reflection {
-#if NET_2_0
[ComVisible (true)]
[ComDefaultInterfaceAttribute (typeof (_MethodBase))]
-#endif
[Serializable]
[ClassInterface(ClassInterfaceType.None)]
+#if MOBILE
+ public abstract class MethodBase: MemberInfo {
+#else
public abstract class MethodBase: MemberInfo, _MethodBase {
-
+#endif
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static MethodBase GetCurrentMethod ();
+ internal static MethodBase GetMethodFromHandleNoGenericCheck (RuntimeMethodHandle handle)
+ {
+ return GetMethodFromIntPtr (handle.Value, IntPtr.Zero);
+ }
+
+ static MethodBase GetMethodFromIntPtr (IntPtr handle, IntPtr declaringType)
+ {
+ if (handle == IntPtr.Zero)
+ throw new ArgumentException ("The handle is invalid.");
+ MethodBase res = GetMethodFromHandleInternalType (handle, declaringType);
+ if (res == null)
+ throw new ArgumentException ("The handle is invalid.");
+ return res;
+ }
+
+ public static MethodBase GetMethodFromHandle (RuntimeMethodHandle handle)
+ {
+ MethodBase res = GetMethodFromIntPtr (handle.Value, IntPtr.Zero);
+ Type t = res.DeclaringType;
+ if (t.IsGenericType || t.IsGenericTypeDefinition)
+ throw new ArgumentException ("Cannot resolve method because it's declared in a generic class.");
+ return res;
+ }
+
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- private extern static MethodBase GetMethodFromHandleInternal(IntPtr handle);
+ private extern static MethodBase GetMethodFromHandleInternalType (IntPtr method_handle, IntPtr type_handle);
- public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle) {
- return GetMethodFromHandleInternal (handle.Value);
+ [ComVisible (false)]
+ public static MethodBase GetMethodFromHandle (RuntimeMethodHandle handle, RuntimeTypeHandle declaringType)
+ {
+ return GetMethodFromIntPtr (handle.Value, declaringType.Value);
}
public abstract MethodImplAttributes GetMethodImplementationFlags();
//
// This is a quick version for our own use. We should override
// it where possible so that it does not allocate an array.
+ // They cannot be abstract otherwise we break public contract
//
- internal virtual int GetParameterCount ()
+ internal virtual ParameterInfo[] GetParametersInternal ()
{
- ParameterInfo [] pi = GetParameters ();
- if (pi == null)
- return 0;
-
- return pi.Length;
+ // Override me
+ return GetParameters ();
}
-#if ONLY_1_1
- public new Type GetType ()
+ internal virtual int GetParametersCount ()
{
- return base.GetType ();
+ // Override me
+ return GetParametersInternal ().Length;
+ }
+
+ internal virtual Type GetParameterType (int pos) {
+ throw new NotImplementedException ();
}
-#endif
[DebuggerHidden]
[DebuggerStepThrough]
-#if NET_2_0 || BOOTSTRAP_NET_2_0
- virtual
-#endif
public Object Invoke(Object obj, Object[] parameters) {
return Invoke (obj, 0, null, parameters, null);
}
return (attr & (int)MethodAttributes.SpecialName) != 0;
}
}
+ [ComVisibleAttribute (true)]
public Boolean IsConstructor {
get {
int attr = (int)Attributes;
}
internal virtual int get_next_table_index (object obj, int table, bool inc) {
+#if !FULL_AOT_RUNTIME
if (this is MethodBuilder) {
MethodBuilder mb = (MethodBuilder)this;
return mb.get_next_table_index (obj, table, inc);
ConstructorBuilder mb = (ConstructorBuilder)this;
return mb.get_next_table_index (obj, table, inc);
}
+#endif
throw new Exception ("Method is not a builder method");
}
-#if NET_2_0 || BOOTSTRAP_NET_2_0
+ [ComVisible (true)]
public virtual Type [] GetGenericArguments ()
{
throw new NotSupportedException ();
public virtual bool IsGenericMethodDefinition {
get {
- throw new NotSupportedException ();
+ return false;
}
}
public virtual bool IsGenericMethod {
get {
- throw new NotSupportedException ();
+ return false;
}
}
-#endif
-#if NET_2_0
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal extern static MethodBody GetMethodBodyInternal (IntPtr handle);
public virtual MethodBody GetMethodBody () {
throw new NotSupportedException ();
}
+
+#if NET_4_0
+ public override bool Equals (object obj)
+ {
+ return obj == (object) this;
+ }
+
+ public override int GetHashCode ()
+ {
+ return base.GetHashCode ();
+ }
+
+ public static bool operator == (MethodBase left, MethodBase right)
+ {
+ if ((object)left == (object)right)
+ return true;
+ if ((object)left == null ^ (object)right == null)
+ return false;
+ return left.Equals (right);
+ }
+
+ public static bool operator != (MethodBase left, MethodBase right)
+ {
+ if ((object)left == (object)right)
+ return false;
+ if ((object)left == null ^ (object)right == null)
+ return true;
+ return !left.Equals (right);
+ }
+
+ public virtual bool IsSecurityCritical {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public virtual bool IsSecuritySafeCritical {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public virtual bool IsSecurityTransparent {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
#endif
+#if NET_4_5
+ public virtual MethodImplAttributes MethodImplementationFlags {
+ get { return GetMethodImplementationFlags (); }
+ }
+#endif
+
+#if !MOBILE
void _MethodBase.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
{
throw new NotImplementedException ();
}
+ Type _MethodBase.GetType ()
+ {
+ // Required or object::GetType becomes virtual final
+ return base.GetType ();
+ }
+
void _MethodBase.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
{
throw new NotImplementedException ();
{
throw new NotImplementedException ();
}
+#endif
}
}