using System.Runtime.InteropServices;
public static void Main()
MethodInfo StaticMethod = typeof(MethodModel<int>).GetMethod("StaticMethod", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
MethodInfo VirtualMethod = typeof(MethodModel<int>).GetMethod("VirtualMethod", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
MethodInfo ProtectedInternalMethod = typeof(MethodModel<int>).GetMethod("ProtectedInternalMethod", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
Console.WriteLine(StaticMethod.GetDeclaraction());
Console.WriteLine(VirtualMethod.GetDeclaraction());
Console.WriteLine(ProtectedInternalMethod.GetDeclaraction());
public class MethodModel<T> : AbstractMethodModel
public static int StaticMethod() { return 1; }
public override int OverrideMethod() { return 1; }
public virtual int VirtualMethod() { return 1; }
public int PublicMethod() { return 1; }
private int PrivateMethod() { return 1; }
internal int InternalMethod() { return 1; }
protected int ProtectedMethod() { return 1; }
protected internal int ProtectedInternalMethod() { return 1; }
public int OutParameterMethod(out int i)
public int RefParameterMethod(ref int i) { return 1; }
public int ParamsParameterMethod(params int[] i) { return 1; }
public int OptionalParameterMethod(int i = 1) { return 1; }
public int InParameterModifierMethod([In] int i) { return 1; }
public int OutParameterModifierMethod([Out] int i)
public int OptionalParameterModifierMethod([Optional] int i) { return 1; }
public T GenericTypeMethod(T i) { return i; }
public T1 GenericMethod<T1, T2>(T1 i, T2 i2) { return i; }
public override int AbstractMethod() { throw new NotImplementedException(); }
public abstract class AbstractMethodModel
public abstract int AbstractMethod();
public abstract int OverrideMethod();
public static class ExtensionMethodModel
public static int ExtensionParameterMethod(this int i)