C# 非泛型类中的泛型方法

C# 非泛型类中的泛型方法,c#,generics,linq-to-sql,C#,Generics,Linq To Sql,我试图创建一个简单的数据访问类,它作为一个库来返回各种实体。在VS 2013中,所有我的实体类都是通过Linq到SQL映射器生成的,所有这些类都可以通过Find(主id)从dataContext返回 我只想定义通用的查找、删除、更新等,而不必对每个表/对象重复它,但我不想创建存储库模式 我如何创建一个通用的方法,不管它如何工作?这就是我所拥有的,当然它说T没有定义,但我认为我们可以在非泛型类中创建泛型方法,那么我做错了什么 我想做的是 var c = DAL<Customer>.Fi

我试图创建一个简单的数据访问类,它作为一个库来返回各种实体。在VS 2013中,所有我的实体类都是通过Linq到SQL映射器生成的,所有这些类都可以通过Find(主id)从dataContext返回

我只想定义通用的查找、删除、更新等,而不必对每个表/对象重复它,但我不想创建存储库模式

我如何创建一个通用的方法,不管它如何工作?这就是我所拥有的,当然它说T没有定义,但我认为我们可以在非泛型类中创建泛型方法,那么我做错了什么

我想做的是

var c = DAL<Customer>.Find(id)

var e = DAL<Employee>.Find(id)
var c=DAL.Find(id)
变量e=DAL.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);
        }
    }
公共类DAL
{
私钥;
私有数据上下文_context=null;
//私有DbSet_table=null;
公共DAL(字符串键)
{
_钥匙=钥匙;
_context=newdatacontext();
}
公共空间处置()
{
_context.Dispose();
}
公共数据库集查找(int-id)
{
var d=_context.Set();
//返回d.Find(id);
}
}
我有点迷路了。。。我不想给你下定义

public class DAL<T> where T:class
公共类DAL,其中T:class
它将每个DAL绑定到一个类型


这是我第一次尝试通用的网络方法,因此任何值得感谢的帮助都应该是这样的:

public T Find<T>(int id) where T : class
{
    return context.Set<T>().Find(id);
}
public T-Find(int-id)其中T:class
{
返回context.Set().Find(id);
}

类似的方法应该可以:

public T Find<T>(int id) where T : class
{
    return context.Set<T>().Find(id);
}
public T-Find(int-id)其中T:class
{
返回context.Set().Find(id);
}

您可以指定类的泛型方法,但需要使用约束:

public class DAL
{
    // .... previously written code
    public DbSet<T> Find<T>(int id) where T : class
    {
        return _context.Set<T>();
    }
}
公共类DAL
{
//..以前编写的代码
公共数据库集查找(int-id),其中T:class
{
返回_context.Set();
}
}
您还必须这样称呼它:

var dal = new DAL();
var data = dal.Find<Customer>(1);
var dal=new dal();
var数据=dal.Find(1);
还要注意的是,您的代码有很多问题,您定义了dispose方法,但没有实现IDisposable接口,实际上没有从该方法返回任何内容,等等


注意:出于所有目的,这仍然是一种存储库模式。

您可以指定类的通用方法,但需要使用约束:

public class DAL
{
    // .... previously written code
    public DbSet<T> Find<T>(int id) where T : class
    {
        return _context.Set<T>();
    }
}
公共类DAL
{
//..以前编写的代码
公共数据库集查找(int-id),其中T:class
{
返回_context.Set();
}
}
您还必须这样称呼它:

var dal = new DAL();
var data = dal.Find<Customer>(1);
var dal=new dal();
var数据=dal.Find(1);
还要注意的是,您的代码有很多问题,您定义了dispose方法,但没有实现IDisposable接口,实际上没有从该方法返回任何内容,等等


注意:无论出于何种目的,这仍然是一种存储库模式。

这与MVC或linq无关,编辑标记……为什么??为什么?var c=DAL.Find(id)=在linq中是一个简单的Db.Customers.Single(c=>c.id==?);你的DAL有什么好处?@Pleun我听到了你的痛苦,我将做的不仅仅是访问(例如,使用一些缓存等,一些集中的代码),如果这没有多大意义,我毫不犹豫地杀死它。这与MVC或linq无关,编辑标签……为什么??为什么?var c=DAL.Find(id)=在linq中是一个简单的Db.Customers.Single(c=>c.id==?);你的DAL有什么好处?@Pleun我听到你的痛苦,我将做的不仅仅是访问(例如,使用一些缓存等,一些集中的代码),如果没有多大意义,我会毫不犹豫地杀死它谢谢你的解释。我剩下的代码还没有完成,我只是想在深入我的代码之前把这个特定的概念弄清楚。谢谢你的解释。我剩下的代码还没有完成,我只是想在深入我的代码之前把这个特定的概念钉牢。