使用企业库的ExecuteSprocAccessor方法和泛型

时间:2011-08-16 18:45:07

标签: c# asp.net sql-server enterprise-library generics

我正在尝试使用.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,这就是为什么我没有指定任何映射器。

由于

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();    
}

告诉编译器“此处传递的任何类型必须具有零参数构造函数。