c# - 使用 DynamicParameters 从 Sqlite 查询中获取接口类型
问题描述
我有一个实现接口的模型类如下;
public class EngTrModel : IWordModel
{
public string Word { get; set; }
public string Translation { get; set; }
public string WordPair
{
get
{
return $"{Word}->{Translation}";
}
}
}
我有一个处理器类,负责连接到 Sqlite 数据库并获取以下所有行;
public class SqliteDataAccess : IDataAccess
{
public static string LoadConnectionString(string id = "Default")
{
return ConfigurationManager.ConnectionStrings[id].ConnectionString;
}
public static List<EngTrModel> LoadDatabase()
{
using (IDbConnection conn = new SQLiteConnection(LoadConnectionString()))
{
var output = conn.Query<EngTrModel>("Select * from Words", new DynamicParameters());
return output.ToList();
}
}
}
在我的 WPF 表单代码中,当我单击“加载记录”按钮时,它可以正常工作并将表行加载到列表框中,如下所示;
private void loadFromDatabase_Click(object sender, RoutedEventArgs e)
{
LoadFromDatabase(SqliteDataAccess.LoadDatabase());
}
private void LoadFromDatabase(List<EngTrModel> words)
{
WordsListBox.ItemsSource = null;
WordsListBox.ItemsSource = words;
WordsListBox.DisplayMemberPath = "WordPair";
}
将来当我扩展我的应用程序以支持其他语言时,例如当我需要将实现 IWordModel 接口的 EngFrModel 添加到我的应用程序中时,我希望能够在不更改任何内容的情况下使用“LoadFromDatabase”方法(开放封闭原则)。我做了一些尝试,但都没有工作;例如,我想使用以下方法而不是硬编码值,并赋予该方法处理不同类型模型和数据库表的功能;
public static List<IWordModel> LoadDatabase(string table)
{
using (IDbConnection conn = new SQLiteConnection(LoadConnectionString()))
{
var output = conn.Query<IWordModel>($"Select * from {table}", new DynamicParameters());
return output.ToList();
}
}
然后我做了以下更改;
private void loadFromDatabase_Click(object sender, RoutedEventArgs e)
{
LoadFromDatabase(SqliteDataAccess.LoadDatabase("Words"));
}
private void LoadFromDatabase(List<IWordModel> words)
{
WordsListBox.ItemsSource = null;
//WordsListBox.ItemsSource = DataAccess.LoadDatabase();
WordsListBox.ItemsSource = words;
WordsListBox.DisplayMemberPath = "WordPair";
}
该代码可以无错误地编译,但它给出 System.ArgumentException:'DynamicMethod 的类型所有者无效。' 以下代码行中的错误;
var output = conn.Query<IWordModel>($"Select * from {table}", new DynamicParameters());
解决方案
推荐阅读
- php - 使用 POST 进行路由以 404 结束
- r - 不推荐使用 Tidyverse 命令:在汇总中进行 T 测试,然后报告所有结果
- html - 如何在表中创建三层行?
- domain-driven-design - 交叉聚合引用:命令处理程序可以在聚合 id 集合之间循环,还是事件处理程序可以分派命令?
- c# - 将一组 yield 返回语句重构为方法
- javascript - 遇到 javascript 画布图形和运动的问题
- if-statement - 谷歌表格勾选框查询
- java - 我们如何在 Android 项目中排除一些单元测试
- office365 - 在 Office Web 插件中调用 Sharepoint REST api
- oracle - ORACLE - 子查询还是不子查询?