gpt4 book ai didi

c# - 真正的通用实现

转载 作者:行者123 更新时间:2023-11-30 20:55:07 25 4
gpt4 key购买 nike

我有带有 Entity Framework 的 win 表单应用程序。在我的 DbContext 中,我有两个实例:表;列。在我的数据访问层中,我有以下代码

public static class DataLoader
{
private static WdmEntities _context;

public static List<T> GetTable<T>() where T : class
{
List<T> res = new List<T>();

using (_context = new WdmEntities())
{

try
{
res = _context.Set<T>().ToList();
}
catch
{
}
}

return res;
}
}

Form.cs 上,我有以下事件处理程序

availableTablesListBox.+= availableTablesListBox_SelectedIndexChanged;

void availableTablesListBox_SelectedIndexChanged(object sender, EventArgs e)
{
//here i need to write code, that call GetTable<T> from DataLoader
//according to the SelectedIndex of availableTablesListBox
}

但我可以写(不是真正的通用)

if (availableTablesListBox.SelectedIndex == 1) 
myDataGrid.DataSource = DataLoader.GetTable<tables>();
else
myDataGrid.DataSource = DataLoader.GetTable<columns>();

我要写一行代码

myDataGrid.DataSource = DataTable.GetTable<WHAT WRITE HERE>();

最佳答案

泛型嵌入到 IL 中,因此没有单个 WHAT WRITE HERE ;您将不得不使用问题中的代码,或者使用基于传递 Type 的非通用实现实例。

一推,您可以使用:

myDataGrid.DataSource = availableTablesListBox.SelectedIndex == 1
? (IList)DataLoader.GetTable<tables>()
: (IList)DataLoader.GetTable<columns>();

但那是……不必要的复杂。

坦率地说,您当前的实现将完成这项工作,除了:

  • 不要吞下异常 - catch忽略事情失败的事实只是一个非常糟糕的主意
  • 调用 ToList()这里强制它加载整个未过滤的表;这通常是个坏主意

如果你想实现一个 Type基于的实现,您可以使用非通用 Set(Type)方法而不是 Set<T>方法。

关于c# - 真正的通用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506599/

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