我对泛型有疑问。我正在尝试使用泛型转换我的代码,因此我不需要为每个特定类型(如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'
可以帮我创建这个通用方法......
答案 0 :(得分:4)
您的FillDataRecord
只能返回EmployeeBO
,因此不清楚为什么要首先使用泛型。为什么名为GetAllEmployees的名称想要返回List<CompanyBO>
例如?
看起来您应该将签名更改为:
public List<EmployeeBO> GetAllEmployees()
并在方法中进行相应的更改。
如果你想编写一个通用方法,你应该弄清楚这个方法和公司的相应方法之间会发生什么变化。我建议在当前的设计中,它将是:
IDataRecord
转换为实体的方法所以这表明你有类似的东西:
public List<T> FetchEntities<T>(string sql, Func<IDataRecord, T> converter)
然后使用方法组转换指定转换器,例如
const string FetchAllEmployeesSql = "SELECT ...";
List<EmployeeBO> employees = FetchEntities(FetchAllEmployeesSql,
FillEmployeeDataRecord);
顺便说一句,你有没有理由为这个建立自己的ORM而不是使用现有的一些ORM?