2 // System.Reflection/MethodBase.cs
5 // Paolo Molaro (lupus@ximian.com)
7 // (C) 2001 Ximian, Inc. http://www.ximian.com
11 using System.Globalization;
12 using System.Reflection.Emit;
13 using System.Runtime.CompilerServices;
14 using System.Runtime.InteropServices;
16 namespace System.Reflection {
19 [ClassInterface(ClassInterfaceType.AutoDual)]
20 public abstract class MethodBase: MemberInfo {
22 [MethodImplAttribute (MethodImplOptions.InternalCall)]
23 public extern static MethodBase GetCurrentMethod ();
25 public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle)
30 public abstract MethodImplAttributes GetMethodImplementationFlags();
32 public abstract ParameterInfo[] GetParameters();
35 // This is a quick version for our own use. We should override
36 // it where possible so that it does not allocate an array.
38 internal virtual int GetParameterCount ()
40 ParameterInfo [] pi = GetParameters ();
50 public Object Invoke(Object obj, Object[] parameters) {
51 return Invoke (obj, 0, null, parameters, null);
54 public abstract Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture);
56 protected MethodBase()
60 public abstract RuntimeMethodHandle MethodHandle { get; }
61 public abstract MethodAttributes Attributes { get; }
62 public virtual CallingConventions CallingConvention { get {return CallingConventions.Standard;} }
63 public Boolean IsPublic {
65 return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public;
68 public Boolean IsPrivate {
70 return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Private;
73 public Boolean IsFamily {
75 return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Family;
78 public Boolean IsAssembly {
80 return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Assembly;
83 public Boolean IsFamilyAndAssembly {
85 return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.FamANDAssem;
88 public Boolean IsFamilyOrAssembly {
90 return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.FamORAssem;
93 public Boolean IsStatic {
95 return (Attributes & MethodAttributes.Static) != 0;
98 public Boolean IsFinal {
100 return (Attributes & MethodAttributes.Final) != 0;
103 public Boolean IsVirtual {
105 return (Attributes & MethodAttributes.Virtual) != 0;
108 public Boolean IsHideBySig {
110 return (Attributes & MethodAttributes.HideBySig) != 0;
113 public Boolean IsAbstract {
115 return (Attributes & MethodAttributes.Abstract) != 0;
118 public Boolean IsSpecialName {
120 int attr = (int)Attributes;
121 return (attr & (int)MethodAttributes.SpecialName) != 0;
124 public Boolean IsConstructor {
126 int attr = (int)Attributes;
127 return ((attr & (int)MethodAttributes.RTSpecialName) != 0
128 && (Name == ".ctor"));
132 internal virtual int get_next_table_index (object obj, int table, bool inc) {
133 if (this is MethodBuilder) {
134 MethodBuilder mb = (MethodBuilder)this;
135 return mb.get_next_table_index (obj, table, inc);
137 if (this is ConstructorBuilder) {
138 ConstructorBuilder mb = (ConstructorBuilder)this;
139 return mb.get_next_table_index (obj, table, inc);
141 throw new Exception ("Method is not a builder method");