【问题标题】:Using Enterprise Library's ExecuteSprocAccessor method with generics将 Enterprise Library 的 ExecuteSprocAccessor 方法与泛型一起使用
【发布时间】:2011-10-28 08:11:58
【问题描述】:

我正在尝试使用一个类来处理数据库上的所有 CRUD,方法是使用带有泛型的 .NET 企业库的 ExecuteSprocAccessor 方法。在我的数据层中,我正在尝试这样的事情:

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, 字符串,参数对象[])'

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    编译器会告诉你哪里出了问题:它需要一个带有零参数公共构造函数的类型。你交给它的只是 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();    
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2019-03-21
      相关资源
      最近更新 更多