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