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") {
}

如果您需要使用不同的基本构造函数,您将为每个构造一个构造函数,并使用静态方法在不同的构造函数之间进行选择。例子:

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

根据构建配置使用一个具有不同值的连接字符串。这是通过配置文件转换来实现的。

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>

当您在 Release 配置中构建项目时,Web.config将具有Foo连接字符串,其值为ServerConnectionString

此外,我建议您使用SlowCheetah包,它允许您根据构建配置转换您的 app.config 或任何其他 XML 文件。


正如我在评论中提到的,如果您出于某种原因不想依赖构建配置,那么您可以向您的依赖注入框架(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 回答