7

パラメータに応じてコンストラクタ内で基本コンストラクタを呼び出す方法は? 例えば:

public SomeConstructor (){
       if(SomeParameter == "something") //here call base("something");
          else //here call base("something else")
}

私の例では

SomeParameter

たとえば、ローカル コンピューター名などです。

私が何をしているのかを説明するために、コンピューター名に応じてコンストラクターを決定したいと思います。私は MVC プロジェクトに取り組んでいますが、サーバーでプロジェクトを公開しているときに接続文字列の名前を変更したことをまだ忘れています。だから、私はコンピュータ名==私のコンピュータ名であるかどうかを指定してから呼び出したい

:base("DefaultConnection")

それ以外の場合は、たとえば呼び出します

:base("ServerConnectionString")
4

4 に答える 4

10

そのようにすることはできません。後者の例のようにしか呼び出すことができません。それでも、両方の例は文字列を渡し、パラメーターの型を変更していないため、この方法は無意味に思えます(異なるコンストラクターでさえありません)あなたが呼んでいます)。従来の方法でコンストラクターを呼び出し、提供された値がその前に有効な値であることを確認することで回避できます。

すぐに使える例として、次のことを考えてみてください。

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
    } 
  }
}
于 2013-02-25T16:42:11.027 に答える
3

異なるコンストラクターを呼び出すことはできませんが、条件演算子を使用して、同じコンストラクターに異なる値を送信できます。

public SomeConstructor ()
  : base(SomeParameter == "something" ? "something" : "something else") {
}

異なる基本コンストラクターを使用する必要がある場合は、それぞれに対して 1 つのコンストラクターを作成し、静的メソッドを使用して異なるコンストラクターから選択します。例:

private SomeConstructor() : base("some", "thing") {}

private SomeConstructor(bool flag) : base("some", "other", "thing") {}

public SomeConstructor Create() {
  if (SomeParameter == "something") {
    return new SomeConstructor();
  } else {
    return new SomeConstructor(true);
  }
}

(ここでは、コンストラクターの署名を異なるものにするためだけにブール値パラメーターを使用しました。それらに送信するデータが異なる場合があるため、そのようにそれらを区別する必要はありません。)

于 2013-02-25T16:49:08.207 に答える
2

これを試して:

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

}

public class Child
{
    public Child(string name) { }
}
于 2013-02-25T16:48:07.187 に答える
1

ビルド構成に応じて、異なる値を持つ 1 つの接続文字列を使用します。これは、構成ファイルの変換によって実現されます。

Web.configで使用

  <connectionStrings>
    <add name="Foo" connectionString="DefaultConnection" />
  </connectionStrings>

Web.Release.configを使用する場合

  <connectionStrings>
    <add name="Foo" connectionString="ServerConnectionString"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>

リリース構成でプロジェクトをビルドすると、Web.configには valueを持つFoo接続文字列が含まれますServerConnectionString

また、ビルド構成に基づいて app.config またはその他の XML ファイルを変換できるSlowCheetahパッケージを使用することをお勧めします。


コメントで述べたように、何らかの理由でビルド構成に依存したくない場合は、依存性注入フレームワーク (Unity、Ninject など) に正しいパラメーターを要求できます。Ninject のサンプルは次のとおりです。

Bind<IFoo>().To<Foo>().WithConstructorArgument("bar", 
     context => IsLocalMachine ? "DefaultConnection" : "ServerConnectionString");

Foo がインスタンス化されるとき (あなたの場合は DbContext)、適切な文字列がコンストラクターに渡されます:

public class Foo : FooBase, IFoo
{
    public Foo(string bar) : base(bar)
    {            
    }
}
于 2013-02-25T16:49:31.400 に答える