gpt4 book ai didi

c# - 使用 lambda 的多态类

转载 作者:行者123 更新时间:2023-11-30 14:58:50 25 4
gpt4 key购买 nike

我不确定这是否可行。由于我正在和我的伙伴一起编写一个程序,我正在尝试学习一些关于 lambda 表达式的知识。所以他有一个与 MS SQL 服务器对话的数据库类。我想对这些类进行一些测试,因此制作了一个简单的紧凑型数据库,在我的 TextFixtureSetup 中填充了表(现在有 2 个表),然后在拆解中删除了所有数据。他的数据库类对他的 SQL 连接使用类似的东西

    protected void WithConnection(Action<SqlConnection> sqlBlock)
{
try
{
using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
connection.Open();
sqlBlock(connection);
}
}
catch (Exception ex)
{
Console.WriteLine(@"Exception during database connection: {0}", ex);
}
}

我想我找到了 Jon Skeet 使用几乎相同的代码回答的帖子。 https://stackoverflow.com/a/1063112/1329396

我认为这很酷,但我的模拟数据库使用 SQLCEReader。我做了一些研究,发现它们共享一个公共(public)类 System.Data.Common.DbDataReader 并且它只是向上一级。我没有检查太多,但我在考虑是否可以使用多态风格的方式来使用 WithConnection 编程风格,这样我就可以使用我的 SQLCeDataReader 和他的 SQLDataReader。有没有办法做到这一点

最佳答案

使用工厂函数。如果您可以通过对所有 Actions 使用 DbConnection 来解决问题,那么您就不需要泛型:

protected void WithConnection(Action<DbConnection> sqlBlock, Func<DbConnection> dbCxnFactory)
{
try
{
using (DbConnection connection = dbCxnFactory())
{
connection.ConnectionString = this.ConnectionString;
connection.Open();
sqlBlock(connection);
}
}
catch (Exception ex)
{
Console.WriteLine(@"Exception during database connection: {0}", ex);
}
}

如果你想专门化,一些 Action 只针对 SqlConnection 而一些 Action 只针对 SqlCeConnection,那么你可以让它通用:

protected void WithConnection<T>(Action<T> sqlBlock, Func<T> dbCxnFactory) where T : DbConnection
{
try
{
using (T connection = dbCxnFactory())
{
connection.ConnectionString = this.ConnectionString;
connection.Open();
sqlBlock(connection);
}
}
catch (Exception ex)
{
Console.WriteLine(@"Exception during database connection: {0}", ex);
}
}

如果不想将工厂作为参数传入,可以使用 new() 的泛型

protected void WithConnection<TCxn>(Action<TCxn> sqlBlock) where TCxn : DbConnection, new()
{
try
{
using (var cxn = new TCxn())
{
cxn.ConnectionString = this.ConnectionString;
cxn.Open();
sqlBlock(cxn);
}
}
catch (Exception ex)
{
Console.WriteLine(@"Exception during database connection: {0}", ex);
}
}

关于c# - 使用 lambda 的多态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com