Yesterday a colleague of mine asked me a question about how to invoke a method of a base class' base class. Although it is possible it is not a good idea (read more on stackoverflow). The basic idea is to avoid MethodDesc::IsVtableMethod() check (see Shared Source Common Language Infrastructure). That said here is the code.
using System;
namespace BaseBaseDemo
{
class A
{
public virtual void M(string text)
{
Console.WriteLine("A:M({0})", text);
}
}
class B : A
{
public override void M(string text)
{
Console.WriteLine("B:M({0})", text);
}
}
class C : B
{
delegate void DelM(string text);
public override void M(string text)
{
var ptr = this.GetType()
.BaseType.BaseType
.GetMethod("M").MethodHandle.GetFunctionPointer();
var m = typeof(DelM)
.GetConstructor(new Type[] { typeof(object), typeof(IntPtr) })
.Invoke(new object[] { this, ptr }) as DelM;
m(text); // base.base.M(text);
base.M(text);
}
}
class Program
{
static void Main(string[] args)
{
new C().M("test");
}
}
}