我正在尝试使用.NET Enterprise Library的ExecuteSprocAccessor方法和泛型来使用一个类来处理数据库上的所有CRUD。在我的数据层,我正在尝试这样的事情:
public static class CRUDDatabase
{
private static Database db = DatabaseFactory.CreateDatabase("ITS");
public static T SelectSingle<T>(string sprocName, int id)
{
return db.ExecuteSprocAccessor<T>(sprocName, id).First();
}
}
但是,我在SelectSingle()方法的返回行上收到一个构建错误,指出:
'T'必须是具有公共无参数的非抽象类型 构造函数,以便在泛型中使用它作为参数'TResult' 类型或方法 “Microsoft.Practices.EnterpriseLibrary.Data.DatabaseExtensions.ExecuteSprocAccessor(Microsoft.Practices.EnterpriseLibrary.Data.Database, string,params object [])'
SelectSingle()方法背后的想法是从数据库传入所需对象的存储过程名称和记录ID。最终我会有SelectAll(),Update(),Delete()等。这些方法中的参数会有所不同,但你会明白我想要完成的任务。
在阅读该错误之后,我开始认为这可能是不可能的,但有人知道这是否可行?此外,我的数据库中的字段与我的类中的字段匹配1:1,这就是为什么我没有指定任何映射器。
由于
答案 0 :(得分:3)
编译器告诉你出了什么问题:它期望一个类型上有一个零参数的公共构造函数。所有你交给它的是T,它不能保证,所以它不会编译。
您需要添加一个通用约束来限制T可以的类型。幸运的是,这很简单:
public static T SelectSingle<T>(string sprocName, int id)
where T : new() // <---- here's the constraint
{
return db.ExecuteSprocAccessor<T>(sprocName, id).First();
}
告诉编译器“此处传递的任何类型必须具有零参数构造函数。