2009-06-09 5 views
44

Disons que nous avons ces deux classes:A partir de la classe de base en C#, obtenez le type dérivé?

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

public class Base 
{ 
    protected Base(string s) 
    { 

    } 
} 

Comment puis-je savoir à partir du constructeur de Base que Derived est l'invocateur? C'est ce que je suis venu avec:

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

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

    } 
} 

Y at-il une autre façon qui ne nécessite pas passer typeof(Derived), par exemple, d'une certaine façon d'utiliser la réflexion du constructeur au sein de Base?

Répondre

79
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 { } 
} 

Ce programme produit les éléments suivants:

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 
+25

Vous cachez le fait intéressant dans beaucoup de code. – VVS

+0

Un meilleur exemple serait d'afficher la sortie de 'Derived1 d1 = new Base();' – Seph

+3

'Derived1 d1 = new Base();' génère une erreur de compilation, vous voulez probablement dire l'inverse. FYI '((Base) new Derived1()). GetType(). Name' est" Derived1 " –

27

GetType() voulez-vous donner ce que vous cherchez.

Questions connexes