非泛型类中的泛型方法

时间:2014-11-06 04:20:22

标签: c# generics linq-to-sql

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

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

如何创建一个无论如何都有效的通用方法?这就是我所拥有的,当然它说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绑定到类型

这是我第一次冒险进入通用方法,所以任何帮助都会受到赞赏

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

public T Find<T>(int id) where T : class
{
    return context.Set<T>().Find(id);
}

答案 1 :(得分:2)

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

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接口,您实际上并没有从方法中返回任何内容等。

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