Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据某些参数在构造函数内部调用基构造函数?_C#_Asp.net Mvc_Entity Framework_Constructor - Fatal编程技术网

C# 如何根据某些参数在构造函数内部调用基构造函数?

C# 如何根据某些参数在构造函数内部调用基构造函数?,c#,asp.net-mvc,entity-framework,constructor,C#,Asp.net Mvc,Entity Framework,Constructor,如何根据参数在构造函数内部调用基构造函数? 例如: public SomeConstructor (){ if(SomeParameter == "something") //here call base("something"); else //here call base("something else") } 以我为例 SomeParameter 例如,可以是本地计算机名 为了解释我在做什么,我想根据计算机名确定构造函数。我正在处理MVC项目,当我在服

如何根据参数在构造函数内部调用基构造函数? 例如:

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

SomeParameter
例如,可以是本地计算机名

为了解释我在做什么,我想根据计算机名确定构造函数。我正在处理MVC项目,当我在服务器上发布项目时,我仍然忘记了更改连接字符串的名称。因此,我想指定computer name==我的计算机名,然后调用

:base("DefaultConnection")
否则,打个比方

:base("ServerConnectionString")

不能这样做,只能像后面的示例那样调用,即使这样,两个示例都在传递字符串而不更改参数类型,因此这种方式似乎毫无意义(它们甚至不是您调用的不同构造函数)。您可以用传统的方法调用构造函数,并确保在此之前提供的值是有效的

作为一个袖手旁观的例子,考虑如下:

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
    } 
  }
}
试试这个:

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

}

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

不能调用不同的构造函数,但可以使用条件运算符将不同的值发送到同一个构造函数:

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);
  }
}

(这里我使用了一个布尔参数,只是为了使构造函数签名有所不同。您可以向它们发送不同的数据,这样您就不需要以这种方式区分它们。)

根据构建配置,使用一个具有不同值的连接字符串。这是通过以下方式实现的

在Web.config中使用

当Foo将被实例化时(在您的例子中是DbContext),相应的字符串将被传递给构造函数:

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

我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。好的,对不起。下次我不会那么做了。非常感谢你的帮助。它工作得很好。我不知道为什么我以前没有想到这个主意:)谢谢你。你的想法也很有用。谢谢。@AdrianKsiężarczyk顺便说一句,如果您希望根据机器名而不是构建配置使用不同的字符串,那么使用依赖项注入框架(将适当的连接字符串名称注入构造函数)就可以轻松解决此问题。@AdrianKsięarczyk我为您添加了DI示例:)
  <connectionStrings>
    <add name="Foo" connectionString="ServerConnectionString"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>
Bind<IFoo>().To<Foo>().WithConstructorArgument("bar", 
     context => IsLocalMachine ? "DefaultConnection" : "ServerConnectionString");
public class Foo : FooBase, IFoo
{
    public Foo(string bar) : base(bar)
    {            
    }
}