2010-08-20 7 views
1

J'ai une classe de base abstraite générique dont je voudrais dériver un type dynamique construit par reflection.emit. De plus, j'ai besoin de personnaliser le constructeur par défaut de la classe dérivée pour initialiser certains champs. Pour construire correctement le constructeur par défaut de la classe dérivée, je dois obtenir le constructeur par défaut de la classe de base et l'appeler. Le problème est que je ne suis pas en mesure d'obtenir le constructeur par défaut de la classe de base.Obtention du constructeur par défaut d'une classe abstraite générique

Un exemple:

public abstract class Test<T> 
{ 
    private T data; 

    public abstract void Go(); 
} 

public class TestDerive : Test<int> 
{ 
    public override void Go() 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ConstructorInfo[] constructors = typeof(Test<>).GetConstructors(); 

     int length = constructors.Length; 
    } 
} 

J'ai tout essayé et la longueur est toujours égale à zéro. Je ne comprends pas. J'ai inspecté des cas similaires dans le réflecteur et il y a en effet un appel au constructeur de base de la classe abstraite. La question est comment puis-je faire pour faire la même chose?

Répondre

6

Le constructeur par défaut d'une classe abstraite est protégé - vous devez spécifier des indicateurs de liaison pour y accéder via la réflexion. Vous pouvez utiliser

typeof(Test<>).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance) 

(Il ne fait aucune différence pratique que ce soit public ou protégé en code normal, bien sûr, que vous ne pouvez pas appeler le constructeur autre que d'un type dérivé.)

Notez que c'est le cas que la classe soit générique ou non - c'est l'abstraction qui vous cause des problèmes.

+0

Merci beaucoup. C'est tout –

Questions connexes