6
votes

Comment appeler Constructeur de base à l'intérieur du constructeur en fonction du paramètre?

Comment appeler constructeur de base à l'intérieur du constructeur en fonction des paramètres? Par exemple: xxx pré>

dans mon exemple p> xxx pré>

pourrait être par exemple un nom d'ordinateur local. P>

expliquer ce que Est-ce que je fais, je veux déterminer le constructeur en fonction du nom de l'ordinateur. Je travaille sur le projet MVC et j'oublie toujours le nom de la chaîne de connexion lorsque je publie un projet sur le serveur. Donc, je veux spécifier si Nom de l'ordinateur == mon nom d'ordinateur, puis appelez p> xxx pré>

sinon, appelez par exemple p>

:base("ServerConnectionString")


2 commentaires

J'ai édité votre titre. S'il vous plaît voir, " Les questions incluent" Tags "dans leurs titres? ", où le consensus est "non, ils devraient ne pas".


D'accord désolé. Je ne ferai pas cela la prochaine fois.


4 Réponses :


9
votes

Vous ne pouvez pas faire de cette façon, vous ne pouvez appeler que dans vos derniers exemples, et même à ce moment-là, vos deux exemples transmettent une chaîne et ne changent pas le type de paramètre, il semble donc que cela semble insensé de cette façon (ils ne sont pas Même différents constructeurs que vous appelez). Vous pouvez vous échapper avec appeler le constructeur de la manière conventionnelle et en veillant à ce que la valeur fournie soit la valide avant celle-ci.

comme étant éteint de l'exemple de manchette, tenez compte des éléments suivants: P>

public SomeConstructor() 
  : base(Configuration.ConnectionString) {

}

public static Configuration {
  public static string ConnectionString {
    get { 
      /* some logic to determine the appropriate value */
#if DEBUG
      return ConfigurationManager.ConnectionStrings["DebugConnectionString"]; 
#else
      return ConfigurationManager.ConnectionStrings["ReleaseConnectionString"]; 
#endif
    } 
  }
}


1 commentaires

Je vous remercie beaucoup pour votre aide. Ça marche très bien. Je ne sais pas pourquoi je n'ai pas frappé cette idée avant :) merci



2
votes

Essayez ceci:

public class TestInherit : Child
{
    public TestInherit()
        : base(Environment.MachineName=="MyPC" ? "here" : "there")
    {
    }

}

public class Child
{
    public Child(string name) { }
}


1 commentaires

Merci de. Votre idée est également très utile. Merci.



3
votes

Vous ne pouvez pas appeler différents constructeurs, mais vous pouvez envoyer des valeurs différentes dans le même constructeur, à l'aide de l'opréat conditionnel: xxx

Si vous devez utiliser différents constructeurs de base, vous feriez. Un constructeur pour chacun et utilisez une méthode statique pour choisir entre différents constructeurs. Exemple: xxx

(Ici, j'ai utilisé un paramètre booléen juste pour rendre les signatures de constructeur différents. Vous pouvez avoir des données différentes à leur envoyer, de sorte que vous n'avez pas besoin de différencier-les de cette façon.)


0 commentaires

1
votes

Utilisez une chaîne de connexion avec des valeurs différentes en fonction de la configuration de la construction. Ceci est réalisé par Transformations de fichier de configuration .

in web.config em> utiliser p> xxx pré>

si web.release.config em> utiliser p> xxx pré>

Lorsque vous construirez votre projet dans la configuration de version, web.config em> aura foo em> chaîne de connexion avec valeur ServerConnectionsRing Code>. P>

Je vous recommande également d'utiliser Slowcheetah package qui vous permet de transformer votre app.config ou tout autre fichier XML basé sur la configuration de construction. P>


Comme je l'ai mentionné dans des commentaires, si vous ne voulez pas dépendre de la configuration du bâtiment pour une raison quelconque, vous pouvez demander à votre cadre d'injection de dépendance (Unity, Ninject, etc.) pour un paramètre correct. Voici un échantillon pour NIJJECT: P>

public class Foo : FooBase, IFoo
{
    public Foo(string bar) : base(bar)
    {            
    }
}


2 commentaires

@ Adrianksiężarczyk BTW Si vous souhaitez des chaînes différentes en fonction du nom de la machine au lieu de la configuration de la machine, il est facilement résolu avec des cadres d'injection de dépendance (nom de chaîne de connexion appropriée sera injecté dans le constructeur)


@ Adrianksiężarczyk j'ai ajouté di échantillon pour vous :)