使用Generic在Asp.Net中创建通用方法

时间:2011-07-24 07:53:11

标签: c# .net-3.5 generics

我对泛型有疑问。我正在尝试使用泛型转换我的代码,因此我不需要为每个特定类型(如CompanyBO,EmployeeBO等)再次更改我的代码...

这是我的代码:

public List<T1> GetAllEmployees<T1>()
{
    try
    {
        var objEmployeeList = new List<T1>();

        SqlConnection objSqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"].ConnectionString);

        if (objSqlCon.State == System.Data.ConnectionState.Closed)
        {
            objSqlCon.Open();
        }

        SqlCommand objSqlCmd = new SqlCommand("SELECT EmployeeID, ContactID, LoginID, Title FROM HumanResources.Employee", objSqlCon);

        SqlDataReader objSqlDataRead;

        objSqlDataRead = objSqlCmd.ExecuteReader();

        while (objSqlDataRead.Read())
        {
            objEmployeeList.Add(FillDataRecord(objSqlDataRead));
        }

        return objEmployeeList;
    }
    catch (Exception ex)
    {

        throw ex;
    }
}


private EmployeeBO FillDataRecord(IDataRecord objDataRecord)
{
    try
    {
        EmployeeBO objEmployeeBO = new EmployeeBO();

        if (!objDataRecord.IsDBNull(objDataRecord.GetOrdinal("EmployeeID")))
        {
            objEmployeeBO.EmployeeID = objDataRecord.GetInt32(objDataRecord.GetOrdinal("EmployeeID"));
        }

        if (!objDataRecord.IsDBNull(objDataRecord.GetOrdinal("ContactID")))
        {
            objEmployeeBO.ContactID = objDataRecord.GetInt32(objDataRecord.GetOrdinal("ContactID"));
        }

        if (!objDataRecord.IsDBNull(objDataRecord.GetOrdinal("Title")))
        {
            objEmployeeBO.Title = objDataRecord.GetString(objDataRecord.GetOrdinal("Title"));
        }

        if (!objDataRecord.IsDBNull(objDataRecord.GetOrdinal("LoginID")))
        {
            objEmployeeBO.LoginID = objDataRecord.GetString(objDataRecord.GetOrdinal("LoginID"));
        }

        return objEmployeeBO;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

我收到1错误:无法从'EmployeeBO'转换为'T1'

可以帮我创建这个通用方法......

1 个答案:

答案 0 :(得分:4)

您的FillDataRecord只能返回EmployeeBO,因此不清楚为什么要首先使用泛型。为什么名为GetAllEmployees的名称想要返回List<CompanyBO>例如?

看起来您应该将签名更改为:

public List<EmployeeBO> GetAllEmployees()

并在方法中进行相应的更改。

如果你想编写一个通用方法,你应该弄清楚这个方法和公司的相应方法之间会发生什么变化。我建议在当前的设计中,它将是:

  • SQL语句
  • 用于将IDataRecord转换为实体的方法

所以这表明你有类似的东西:

public List<T> FetchEntities<T>(string sql, Func<IDataRecord, T> converter)

然后使用方法组转换指定转换器,例如

const string FetchAllEmployeesSql = "SELECT ...";

List<EmployeeBO> employees = FetchEntities(FetchAllEmployeesSql,
                                           FillEmployeeDataRecord);

顺便说一句,你有没有理由为这个建立自己的ORM而不是使用现有的一些ORM?