是否可以绕过C#函数参数强类型
本文关键字:函数 参数 强类型 是否 | 更新日期: 2024-07-27 06:21:24
我有一个C#应用程序,它使用ADO.Net访问特定类型的数据库(VistaDB),我需要对其进行扩展,以选择性地使用第二种数据库(SQL Server)。
我无法使用Vista实体框架数据访问(它可以支持多种数据库类型),因为这需要比大多数用户更高版本的.NET框架。我的数据访问函数以VistaDBConnection作为ref参数,虽然我可以重载这些函数以提供SqlConnection参数支持,但这意味着要复制大量数据访问函数。
我想知道是否可以将函数参数定义为VistaDBConnection或SqlConnection类型,然后测试传递的类型,并在数据访问例程中提供使用这两种类型的选项。我可以通过将VistaConnection和SqlConnection参数都传递给数据访问函数来实现这一点,但传递单个参数或变量类型会更简洁。然而,这确实打破了C#的强类型特性。
最好是创建一个接口或基类。然后有两个具体的类来实现这个接口,一个用于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);
}
}
您只需要定义更通用的类型,或者我们可以说连接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-else中单独实现。如果你想要的在父类中都可用,就像在这种情况下一样。如果你只想调用connect方法,那么你可以像下面这样做,因为它在IDbConnection中确实有connect方法。
public void Connect(IDbConnection dbConnection)
{
dbConnection.Open();
}
它既适用于sql server,也适用于vistadb。
其想法是,使用接口作为参数的类型,而不是使用类作为参数的类别。此接口将由您定义,并针对每种类型的连接单独实现。现在,当您传递实现接口的任何类的实例时,您的代码就会工作。
使用Interface函数可以调用特定于提供程序的函数。
其他贡献者添加的前两个代码示例就是正确的例子,请使用其中的任何一个。