我创建了一个类,其中主要任务是从数据库获取数据并将其映射到某个对象。问题是同一个类需要将不同的datareader映射到不同的对象。所以,我试图做的是使用委托来获取映射方法。
这是我的代码的一部分。以粗体显示重要的行。
public class GetDetails<T>
{
**public delegate void DelegateMapping(T position, IDataReader reader);**
**public DelegateMapping mappingMethod;**
public T Get(T instance)
{
//Get IDs and Add to list
_db.ExecuteReader(storedProcedure.ToString(), CommandType.StoredProcedure, reader =>
{
while ( reader.Read() )
{
**mappingMethod(instance, reader);**
}
}, parameterList.ToArray());
return instance;
}
}
这是调用和使用“GetDetails”类
的类public class PositionDB : DbBase
{
public Position GetPositionDetails(string IDs)
{
GetDetails<Position> getIDs = new GetDetails<Position>(base.db);
getIDs.storedProcedure = StoredProcedure.NET_ADM_GetPositionDetails;
//Set the Delegated Method
**getIDs.mappingMethod = MappingPositionDetails;**
//Set Parameters
getIDs.parameterList.AddInParam("PositionIds", DbType.String, IDs);
//Return the PositionId Collection
return getIDs.Get(new Position());
}
**private void MappingPositionDetails(Position position, IDataReader reader)
{
position.Id = reader["CompPositionId"];
position.Description = reader["Description"];
position.ExpirationDate = reader["ExpirationDate"];
position.Title = reader["Title"];
}**
}
代码工作正常。
问题是:
非常感谢
塞巴斯蒂安
答案 0 :(得分:1)
专门回答您的问题:
我建议进行三项修改:
注意:2和3至少需要.net 3.5。
使用这两个提案,您的代码将如下所示:
public class GetDetails<T>
{
public T Get (T instance, Action<T, IDataReader> mappingMethod)
{
//Get IDs and Add to list
_db.ExecuteReader(storedProcedure.ToString(), CommandType.StoredProcedure, reader =>
{
while ( reader.Read() )
{
mappingMethod(instance, reader);
}
}, parameterList.ToArray());
return instance;
}
}
现在您也可以在多线程环境中使用此方法。
修改强>
刚刚意识到它只是代码的一部分。我更正了我的建议,将其考虑在内。
答案 1 :(得分:0)
public Action<Position, IDataReader> Mapping { get; set; }
然后
getIDs.Mapping = (position, reader) =>
{
position.Id = reader["CompPositionId"];
position.Description = reader["Description"];
position.ExpirationDate = reader["ExpirationDate"];
position.Title = reader["Title"];
};