使用企业库的ExecuteSprocAccessor方法和generics

我试图通过使用带有generics的.NET Enterprise Library的ExecuteSprocAccessor方法,使用一个类来处理数据库上的所有CRUD。 在我的数据层中,我尝试这样的事情:

public static class CRUDDatabase { private static Database db = DatabaseFactory.CreateDatabase("ITS"); public static T SelectSingle(string sprocName, int id) { return db.ExecuteSprocAccessor(sprocName, id).First(); } } 

但是,我在SelectSingle()方法的返回行上得到一个构建错误,指出:

‘T’必须是具有公共无参数构造函数的非抽象类型,才能在generics类型或方法’Microsoft.Practices.EnterpriseLibrary.Data.DatabaseExtensions.ExecuteSprocAccessor(Microsoft.Practices.EnterpriseLibrary)中将其用作参数’TResult’。 Data.Database,string,params object [])’

SelectSingle()方法背后的想法是从数据库传入所需对象的存储过程名称和记录ID。 最终我会有SelectAll(),Update(),Delete()等。这些方法中的参数会有所不同,但你会明白我想要完成的任务。

在阅读了这个错误之后,我开始认为这可能是不可能的,但有人知道这是否可行? 此外,我的数据库中的字段与我的类中的字段匹配1:1,这就是为什么我没有指定任何映射器。

谢谢

编译器告诉你出了什么问题:它期望一个类型上有一个零参数的公共构造函数。 所有你交给它的是T,它不能保证,所以它不会编译。

您需要添加一个通用约束来限制T的类型。 幸运的是,这很简单:

 public static T SelectSingle(string sprocName, int id) where T : new() // <---- here's the constraint { return db.ExecuteSprocAccessor(sprocName, id).First(); } 

这告诉编译器“这里传递的任何类型都必须有一个零参数构造函数。