非泛型类中的泛型方法
问题描述:
我试图创建一个简单的数据访问类,它充当库来返回各种实体。我所有的实体类都是通过VS 2013中的Linq-to-SQL映射器生成的,所有实体类都可以通过Find(primary id)从dataContext返回非泛型类中的泛型方法
我想定义一般的Find,Delete,更新等,而不必为每个表/对象重复它,但我不想创建一个存储库模式。
如何创建一个通用的方法,无论工作吗?这就是我所拥有的,当然它说T没有定义,但我认为我们可以在非泛型类中创建泛型方法,所以我做错了什么?
我想什么做的是一样的东西
var c = DAL<Customer>.Find(id)
var e = DAL<Employee>.Find(id)
...等
我试图写的代码是
public class DAL
{
private string _key;
private DataContext _context = null;
//private DbSet<T> _table = null;
public DAL(string key)
{
_key = key;
_context = new DataContext();
}
public void Dispose()
{
_context.Dispose();
}
public DbSet<T> Find<T>(int id)
{
var d = _context.Set<T>();
//return d.Find(id);
}
}
我有点失落...我不想定义
public class DAL<T> where T:class
它关系到每个DAL一种类型
这是我第一次涉足通用nethods所以任何帮助赞赏
答
您可以指定一个通用的方法一类的,但你需要使用一个约束:
public class DAL
{
// .... previously written code
public DbSet<T> Find<T>(int id) where T : class
{
return _context.Set<T>();
}
}
你也必须这样称呼它:
var dal = new DAL();
var data = dal.Find<Customer>(1);
另外请注意,您的代码有很多问题,你定义一个Dispose方法,但你不实现IDisposable接口,你没有真正从方法返回任何东西,等等。
注意:对于所有意图和目的,这仍然是存储库模式。
+0
谢谢你的解释。我剩下的代码还没有完成,我只是试图在深入我的代码之前弄清这个特定的概念。 – Gerry 2014-11-06 13:37:45
答
像这样的东西应该工作:
public T Find<T>(int id) where T : class
{
return context.Set<T>().Find(id);
}
这与MVC或LINQ无关,编辑标签... – 2014-11-06 04:50:02
为什么?为什么?? var c = DAL。find(id)=在linq中有一个简单的Db.Customers.Single(c => c.id ==?); DAL的好处是什么? –
Pleun
2014-11-06 20:38:48
@Pleun我听到你的痛苦,我会做更多的不仅仅是访问(例如,采用一些缓存等,一些集中代码),如果没有多大意义,我没有任何疑虑,它会将其杀死 – Gerry 2014-11-07 15:40:54