views:

808

answers:

2

Let's say we've got these two classes:

public class Derived : Base
{
    public Derived(string s)
     : base(s)
    { }
}

public class Base
{
    protected Base(string s)
    {

    }
}

How can I find out from within the ctor of Base that Derived is the invoker? This is what I came up with:

public class Derived : Base
{
    public Derived(string s)
     : base(typeof(Derived), s)
    { }
}

public class Base
{
    protected Base(Type type, string s)
    {

    }
}

Is there another way that doesn't require passing typeof(Derived), e.g. some way of using reflection from within Base's ctor?

+11  A: 
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Base b = new Base();
            Derived1 d1 = new Derived1();
            Derived2 d2 = new Derived2();
            Console.ReadKey(true);
        }
    }

    class Base
    {
        public Base()
        {
            Console.WriteLine("Base Constructor. Calling type: {0}", this.GetType().Name);
        }
    }

    class Derived1 : Base { }
    class Derived2 : Base { }
}

This program outputs the following:

Base Constructor: Calling type: Base
Base Constructor: Calling type: Derived1
Base Constructor: Calling type: Derived2
Juliet
You're hiding the one interesting fact in lots of code.
VVS
+5  A: 

Wouldn't GetType() give you what you're looking for?

Joe Enos