I'm using Cecil to inspect my program. It is working really great with one 
exception. How can I use Cecil to find the implementation of an abstract 
method?

When I use the code below to inspect my program the variable 
*myMethodDefinition* represents the abstract method 
*AbstractBase::MyMethod()* instead of *ImplementingType::MyMethod()*. The 
later is the method that I would like to find. Just reading the source code 
it is obvious that the method *CallAbstractMethod* is actually calling 
*ImplementingType::MyMethod()*.

*My question:* What can I do to get my Cecil code to find the implementing 
method *ImplementingType::MyMethod()*?

(A color coded version of the code can be found at 
http://paste2.org/mILatbNn)

    internal static class Program
    {
        /// <summary>
        /// The main method contains the Cecil code that is used to inspect 
the "actual" program
        /// which is implemented in the three classes ExampleProgram, 
AbstractBase and ImplementingType
        /// </summary>
        private static void Main()
        {
            var assembly = 
AssemblyDefinition.ReadAssembly(Assembly.GetExecutingAssembly().Location);

            var exampleProgram = assembly.MainModule.Types
                .Single(t => t.Name == "ExampleProgram");

            var callingMethod = exampleProgram.Methods
                .Single(m => m.Name == 
"CallImplementationOfAbstractMethod");

            var myMethodReference =
                callingMethod.Body.Instructions.Where(i => i.OpCode == 
OpCodes.Callvirt)
                    .Select(i => (MethodReference)i.Operand)
                    .Single();

            var myMethodDefinition = myMethodReference.Resolve();
        }
    }

    public class ExampleProgram
    {
        /// <summary>
        /// Makes a call to the implementation of the abstract method 
MyMethod
        /// </summary>
        public void CallImplementationOfAbstractMethod()
        {
            var implementingType = new ImplementingType();
            var result = implementingType.MyMethod();
        }

        abstract class AbstractBase
        {
            internal abstract bool MyMethod();
        }

        class ImplementingType : AbstractBase
        {
            internal override bool MyMethod()
            {
                return true;
            }
        }
    }

-- 
-- 
--
mono-cecil
--- 
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to