如何根据某些参数在构造函数内部调用基构造函数
本文关键字:构造函数 内部 调用 参数 何根 | 更新日期: 2023-09-27 18:00:55
如何根据参数在构造函数内部调用基构造函数?例如:
public SomeConstructor (){
if(SomeParameter == "something") //here call base("something");
else //here call base("something else")
}
在我的示例中
SomeParameter
可以是例如本地计算机名。
为了解释我在做什么,我想根据计算机名称来确定构造函数。我正在做MVC项目,当我在服务器上发布项目时,我仍然忘记更改连接字符串的名称。所以,我想指定计算机名称是否=我的计算机名称,然后调用
: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 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);
}
}
(这里我使用了一个布尔参数,只是为了让构造函数签名不同。你可能有不同的数据要发送到它们中,所以你不需要用这种方式来区分它们。(
试试这个:
public class TestInherit : Child
{
public TestInherit()
: base(Environment.MachineName=="MyPC" ? "here" : "there")
{
}
}
public class Child
{
public Child(string name) { }
}
根据构建配置使用一个具有不同值的连接字符串。这是通过配置文件转换实现的。
在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将具有值为ServerConnectionString
的Foo连接字符串。
此外,我建议您使用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)
{
}
}