53 votes

Remplacer Constructeur par Défaut de la Classe Partielle avec une Autre Classe Partielle

Je ne pense pas que ce soit possible, mais si est alors que j'en ai besoin :)

J'ai un auto-proxy généré le fichier à partir de la wsdl.exe outil de ligne de commande de Visual Studio 2008.

Le proxy sortie des classes partielles. Je veux remplacer le constructeur par défaut qui est généré. Je préfère ne pas modifier le code, car il est auto-généré.

J'ai essayé de faire une autre classe partielle et redéfinir le constructeur par défaut, mais qui ne fonctionne pas. J'ai ensuite essayé d'utiliser le remplacer et de nouveaux mots-clés, mais cela ne fonctionne pas.

Je sais que je pourrais hériter de la classe partielle, mais cela signifierait que je serais obligé de changer tout le code source pour pointer vers la nouvelle classe parent. Je préfère ne pas avoir à le faire.

Des idées, des solutions, ou des hacks?

//Auto-generated class
namespace MyNamespace {
   public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
      public MyWebService() {
         string myString = "auto-generated constructor";
         //other code...
      }
   }
}

//Manually created class in order to override the default constructor
namespace MyNamespace {
   public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
      public override MyWebService() { //this doesn't work
         string myString = "overridden constructor";
         //other code...
      }
   }
}

71voto

Tom Chantler Points 8266

J'ai eu un semblable prolem, avec mon code généré en cours de création par un fichier dbml (je suis en utilisant Linq-to-SQL classes).

Dans la classe générée il appelle une partielle vide appelé OnCreated() à la fin du constructeur.

Longue histoire courte, si vous voulez garder l'important constructeur de trucs de la classe générée le fait pour vous (que vous devriez probablement faire), puis dans votre classe partielle créer les suivants:

partial void OnCreated()
{
    // Do the extra stuff here;
}

41voto

configurator Points 15594

Ce n'est pas possible. Classes partielles sont essentiellement des pièces de la même classe; aucune méthode peut être défini de deux ou remplacé, et qui comprend le constructeur.

Vous pourriez l'appeler une méthode dans le constructeur, et seulement de mettre en œuvre dans l'autre partie du fichier.

4voto

rrreee Points 41

En fait, c'est maintenant possible, maintenant que les méthodes partielles ont été ajoutés. Voici la doc:

http://msdn.microsoft.com/en-us/library/wa80x488.aspx

Fondamentalement, l'idée est que vous pouvez déclarer et appeler une méthode dans un fichier où vous êtes à la définition de la classe partielle, mais pas réellement de définir la méthode utilisée dans ce fichier. Dans l'autre fichier, vous pouvez ensuite définir la méthode. Si vous êtes à la construction d'une assemblée où la méthode n'est pas définie, l'ORM va supprimer tous les appels à la fonction.

Ainsi, dans le cas ci-dessus, il devrait ressembler à ceci:

//Classe Auto-générée

namespace MyNamespace {
   public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
      public MyWebService() {
         string myString = "auto-generated constructor";
         OtherCode();
      }
   }
}

partial void OtherCode();

//Créer manuellement de classe afin de remplacer le constructeur par défaut

partial void OtherCode()
{
   //do whatever extra stuff you wanted.
}

Il est quelque peu limitée, et dans ce cas particulier, où vous avez un fichier généré que vous auriez besoin de les modifier, il pourrait ne pas être la bonne solution, mais pour les autres, qui a trébuché sur ce en essayant de la fonctionnalité de remplacement dans les classes partielles, cela peut être très utile.

2voto

jonnii Points 17046

Vous ne pouvez pas faire cela. Je suggère l'utilisation partielle d'une méthode que vous pouvez ensuite créer une définition pour. Quelque chose comme:

public partial class MyClass{ 

    public MyClass(){  
        ... normal construction goes here ...
        AfterCreated(); 
    }

    public partial void OnCreated();
}

Le reste devrait être assez explicite.

EDIT:

Je tiens également à souligner que vous devez définir une interface pour ce service, vous pouvez alors programmer de sorte que vous n'avez pas à avoir des références à la mise en œuvre effective. Si vous avez fait cela, alors vous auriez un peu d'autres options.

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:

X