如何检查传入的bool并设置私有字段然后发送到Base Constructor

时间:2009-10-05 02:19:22

标签: c#

我不知道该怎么做。

目标:我想检查传入的bool useWebServiceConnection(如下所示)并设置私有字段connectionString,然后根据useWebServiceConnection将其传递给基本构造函数以设置connectionString。

我认为首先调用基类构造函数总是对的吗?所以这不会起作用。

现在我也得到了“无法在静态上下文中访问静态属性”这一行:

public ProjectDB(bool useWebServiceConnection) : base(connectionString)

BASE CLASS:

公共类DatabaseBase  {   private readonly string connectionString;   private bool useCounters;

public DatabaseBase(string connectionString)   {    this.connectionString = connectionString;   }

DERIVED CLASS:

public class ProjectDB : DatabaseBase
{
    private bool useWebServiceConnection;
    private string connectionString;

private bool isWebServiceCall;

public ProjectDB(bool useWebServiceConnection) : base(connectionString)
{
    this.useWebServiceConnection = useWebServiceConnection;
    connectionString = this.useWebServiceConnection == true ? ConfigurationManager.AppSettings["ServiceConnectionString"] : ConfigurationManager.AppSettings["SomeOtherConnectionString"];
}

private SqlConnection CreateConnection()
{
    return new SqlConnection(ConnectionString);
} 

在我改变你上面看到的内容之前,Derived类最初的工作方式是这样的(我们已经让它像这样工作,直到需要检查bool并在需要时更改连接字符串):

public class ProjectDB : DatabaseBase
{

    readonly static string connectionString = ConfigurationManager.AppSettings["SomeOtherConnectionString"];

    public ProjectDB() : base(connectionString)
    {
    }

    private SqlConnection CreateConnection()
    {
        return new SqlConnection(connectionString);
    }

更新:这就是我想出的。根据你的帮助,看一下原版与我尝试的内容以及我提出的内容:

public class ProjectDB : DatabaseBase
 {
    readonly static string connectionString = ConfigurationManager.AppSettings["SomeOtherConnectionString"];

    private bool useWebServiceConnection;

     private bool isWebServiceCall;

    public ProjectDB() : base(connectionString)
    {
    }

    public ProjectDB(bool useWebServiceConnection) : base(useWebServiceConnection
            ? ConfigurationManager.AppSettings["ServiceConnectionString"]
            : ConfigurationManager.AppSettings["SomeOtherConnectionString"])
    {

    }

请注意,派生类中有一个本地connectionString字段。这就是现有代码可以调用和实例化ProjectDB()而不传入任何值,这意味着它将只使用默认的数据库连接字符串“SomeOtherConnection”,因为它初始化为派生类的顶部,如您所见。

我们现在也有第二个重载的构造函数。在您的帮助下,现在我可以选择在创建新的ProjectDB对象时指定是否使用特殊服务连接字符串。

我认为这是一个很好的解决方案。如果没有,或者如果你有一个更好的更清洁的想法让我知道,但我学到了一些好的想法,并且不知道我可以向前推进那个本地构造函数的基础构造函数的参数,所以非常感谢...现在我知道了。

但有一点,我现在并不需要一个本地支持字段useWebServiceConnection,因为我刚刚将它传递给了我的基类的构造函数。所以这已经过时,所以我从构造函数中删除了它:

this.useWebServiceConnection = useWebServiceConnection;

3 个答案:

答案 0 :(得分:1)

试试这个:

public class DatabaseBase
{
    private readonly string connectionString;
    private bool useCounters;

    public DatabaseBase(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public string ConnectionString
    {
        get { return connectionString; }
    }
}

public class ProjectDB : DatabaseBase
{
    private bool useWebServiceConnection;
    private bool isWebServiceCall;

    public ProjectDB(bool useWebServiceConnection)
        : base(
            useWebServiceConnection
                ? ConfigurationManager.AppSettings["ServiceConnectionString"]
                : ConfigurationManager.AppSettings["SomeOtherConnectionString"])
    {
        this.useWebServiceConnection = useWebServiceConnection;
    }

    private SqlConnection CreateConnection()
    {
        return new SqlConnection(ConnectionString);
    }
}

答案 1 :(得分:0)

public ProjectDB(bool useWebServiceConnection) 
    : base(ConfigurationManager.AppSettings[useWebServiceConnection ? "ServiceConnectionString" : "SomeOtherConnectionString"])
{
    this.useWebServiceConnection = useWebServiceConnection;
}

答案 2 :(得分:0)

必须在派生类之前构造基类,因为派生类可能依赖于派生类。您可以在这里采取一些方法:

  1. 为值提供一个setter并将其设置为它。

  2. 使connectionString受到保护,以便派生可以直接设置它并允许默认构造函数。

  3. 将信息外部化为应用程序设置并根据需要进行检索,而不是在课程中进行检索。

  4. 也将它添加到派生构造函数中。当然,这可能会稍微改变一下流程,你必须在课堂外做出决定。