有可能绕过C#函数参数强类型吗?

时间:2015-02-24 04:50:51

标签: c# strong-typing

我有一个C#应用程序使用ADO.Net访问特定类型的数据库(VistaDB),我需要扩展它以选择性地使用第二种类型的数据库(SQL Server)。

我无法使用Vista Entity Framework数据访问(可以支持多种数据库类型),因为这需要比我的大多数用户更高版本的.NET框架。我的数据访问函数将VistaDBConnection作为ref参数,虽然我可以重载函数以提供SqlConnection参数支持,但这意味着复制大量的数据访问函数。

我想知道是否可以将函数参数定义为VistaDBConnection或SqlConnection类型,然后测试已传递的类型,并在数据访问例程中提供选项以使用它们。我可以通过将VistaConnection和SqlConnection参数传递给数据访问函数来完成此操作,但传递单个参数或变量类型将更整洁。但是,这确实打破了C#的强类型功能。

3 个答案:

答案 0 :(得分:2)

最好的方法是创建接口或基类。然后有两个实现此接口的具体类,一个用于VistaDB,另一个用于SQL Server。然后,您可以使用某种工厂(或依赖注入)在运行时实例化正确的类。然后,所讨论的方法将采用接口/基类的实例,并且不需要知道任何特定的内部工作。例如:

interface IApplicationDatabase
{
    Foo GetFoo(int id);
}

class VistaDatabase : IApplicationDatabase
{
    public Foo GetFoo(int id)
    {
        //do VistaDB-specific things to get the Foo
    }
}

class SqlServerDatabase : IApplicationDatabase
{
    public Foo GetFoo(int id)
    {
        //do SQL Server-specific things to get the Foo
    }
}

class Demo
{
    public Foo GetFooFromStorage(int id, IApplicationDatabase storage)
    {
        //notice here we don't need any separate code depending on the
        //concrete type of database
        return storage.GetFoo(id);
    }
}        

答案 1 :(得分:1)

您只需要定义更多泛型类型,或者我们可以说两种连接SQL以及VistaDB连接的父类型如下所示。然后使用as运算符来强制转换并检查null,以检查强制转换是否成功。

public void Connect(DbConnection dbConnection)
{
    var sqlDbCon = dbConnection as SQLConnection;
    if(con != null)
    {
       //process here for SQLConnection
    }

    var vistaDbCon = dbConnection as VistaDbConnection;
    if(con != null)
    {
       //process here for VistaDbConnection
    }

}

你不需要在if if中单独执行如果你想要的所有内容在父类中都可用,就像在这种情况下你只想调用connect方法然后你可以像下面这样做,因为它确实有IDbConnection中的connect方法。

public void Connect(IDbConnection dbConnection)
{
    dbConnection.Open();
}

它适用于sql server和vistadb。

答案 2 :(得分:0)

这个想法是,不要使用类作为参数的类型,而是使用interface作为参数的类型。 此接口将由您定义,并针对每种类型的连接单独实施。 现在,当您传递实现该接口的任何类的实例时,您的代码将起作用。

使用接口功能调用提供者特定的功能。

其他贡献者添加的前两个代码示例就是正确的示例,使用其中任何一个。