56 votes

C #: Créer une instance d'objet sans invoquer de constructeur?

En C#, est-il possible d'instancier une instance d'une classe, sans invoquer son constructeur?

Supposons que la classe est public et est défini dans une 3e partie de la bibliothèque et le constructeur est interne. Les raisons que je veux faire, ce sont complexes, mais il serait utile de savoir si c'est possible à l'aide d'une sorte de C# hackery.

NOTE: j'ai précisément ne veux pas appeler de tout constructeur , donc en utilisant la réflexion d'accéder à l'intérieur du constructeur n'est pas une option.

67voto

Hallgrim Points 7198

Je n'ai pas essayé cela, mais il existe une méthode appelée GetUninitializedObject qui est utilisée lors de la désérialisation.

Remarques de MSDN:

Comme la nouvelle instance de l'objet est initialisée à zéro et qu'aucun constructeur n'est exécuté, il est possible que l'objet ne représente pas un état considéré comme valide par cet objet.

9voto

Zachary Yates Points 4952

En fait il semble comme ils ont fait le constructeur interne, de sorte que vous ne pouvez pas l'instancier. Il peut avoir un constructeur ou une méthode de fabrique.

Consultez ces articles:

Prévention De La Troisième Partie De La Dérivation: Partie 1

Prévention De La Troisième Partie De La Dérivation: Partie 2

ils genre d'expliquer le raisonnement.

3voto

Orion Edwards Points 54939

En C #, existe-t-il un moyen d'instancier une instance d'une classe sans invoquer son constructeur?

Non, vous ne pouvez pas faire ça. Oui, vous pouvez

1voto

FlySwat Points 61945

EDIT: mise à jour de votre question, vous voulez construire une classe sans constructeur. Ou appeler un défaut "Constructeur Vide".

Ce ne peut pas être fait, car le compilateur ne génère pas d'un constructeur par défaut si il y est déjà spécifié. Cependant, pour le bénéfice des lecteurs, voici comment les obtenir à l'intérieur, protégé ou privé constructeur:

En supposant que votre classe est appelée Foo:

using System.Reflection;

// If the constructor takes arguments, otherwise pass these as null
Type[] pTypes = new Type[1];
pTypes[0] = typeof(object);    
object[] argList = new object[1];
argList[0] = constructorArgs;

ConstructorInfo c = typeof(Foo).GetConstructor
    (BindingFlags.NonPublic |
     BindingFlags.Instance,
     null,
     pTypes,
     null);

Foo foo = 
    (Foo) c.Invoke(BindingFlags.NonPublic,
                   null, 
                   argList, 
                   Application.CurrentCulture);

Laid, mais il fonctionne.

Bien sûr, il y a peut être une raison parfaitement légitime de marque d'un constructeur à l'interne, de sorte que vous devriez vraiment envisager la logistique de ce que vous voulez avant de l'abus de cette classe par arriver chez elle avec la réflexion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: