From base class in C#, get derived type?

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 constructor 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), for example, some way of using reflection from within Base's constructor?

60296 次浏览
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();
Base d3 = new Derived1();
Base d4 = 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
Base Constructor: Calling type: Derived1
Base Constructor: Calling type: Derived2

GetType() would give you what you're looking for.