gpt4 book ai didi

c# - 关于 c# 接口(interface)和泛型的问题

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

我们构建了一个生成整个数据访问的内部工具,每个表都有一个类来表示它的数据和所有常见操作。(想想轻量级 Entity Framework )。

这些 DataAccess 对象总是有一个接收连接字符串的构造函数和一个接收 SqlDataReader 的 Load 函数。

像这样:

class Customer
{
public string ConnStr;
public int Id;
public string Name;

Public customers(string connStr)
{
ConnStr = connStr;
}

public Customer Load(SqlDataReader)
{
if(reader.Read())
{
Id = reader["Id"].ToString();
Name = reader["Name"].ToString();
}
}
}

我想编写一个实用的数据访问静态方法,它允许我编写 SQL 并获取返回的对象列表,遵循前面的对象示例:

string SQL = "SELECT * FROM Customers WHERE Name=@Name";
List<Customer> customers = GetList<Customer>(connStr, SQL, new SqlParameters("@Name", "John"));

我不知道如何处理它,我已经尝试过接口(interface),但它们不允许构造函数或静态方法,并且使用泛型 - 我无法调用初始化对象所需的方法(构造函数 +加载),这是我最近的尝试,注释掉了不起作用的部分:


public static List<T> GetList<T>(string connStr, string SQL, params SqlParameter[] prms)
{
List<T> list = new List<T>();

using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();

SqlCommand cmd = new SqlCommand(SQL, conn);
foreach (SqlParameter param in prms)
{
cmd.Parameters.Add(param);
}

using (SqlDataReader reader = cmd.ExecuteReader())
{

//T item = new T(connStr);
//item.Load(reader);
//list.Add(item);
}
}

return list;
}

顺便说一句,我们有兴趣开源我们的 DataAccess 生成器,这太棒了 - 它允许非常有效地访问数据库对象 + 创建一个 javascript 数据访问层,让您可以从 javascript 完全控制您的数据库(当然这有安全隐患可以管理)。

如果这里有人知道如何“开源”这样的项目或任何想加入该产品开发的公司 - 请随时与我联系:eytan@titkadem.co.il

提前致谢,艾坦

最佳答案

Load 非常简单 - 您可以:

interface IDataEntity {
void Load(SqlDataReader reader);
}

然后:

public static List<T> GetList<T>(string connStr, string SQL,
params SqlParameter[] prms) where T : IDataEntity, new()
{
....
T item = new T();
item.Load(reader);
list.Add(item);
}

new T(connStr) 比较棘手 - 它真的需要这个值吗?公共(public)属性(property)会更容易:

interface IDataEntity {
void Load(SqlDataReader reader);
string ConnectionString {get;set;}
}
class Customer : IDataEntity
{ ... }

等没有对参数化通用构造函数的任何内置(语言)支持。您可以绕过它,但在许多情况下,Activator.CreateInstance 的参数化形式足够快(与通过网络访问数据相比,反射可以忽略不计)。如果您需要参数化版本,可以使用Expression 等来完成(如果您需要示例,请告诉我)。

关于c# - 关于 c# 接口(interface)和泛型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977355/

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