从泛型类调用方法

时间:2012-12-09 10:58:08

标签: c# generics data-access-layer

我正在构建通用sharepoint DALL,所以我需要一个帮助。 我不知道这是否适用,但逻辑​​上一定是这样。

我的问题是我的gr8 TTL不确定他需要使用什么数据源:S(SQL或SharePoint列表),他需要为项目开始开发。

所以我需要构建DAL,因为SP列表是我的数据源,因此将来的变化将是最小的。

现在我所拥有的是baseDAL,包括所有常见的操作,如delete,getAll ,,,等

myBase dal类现在类似于

public class BaseDAL<T> where T : BaseInfo,new()
{
    public virtual List<T> GetAllItem()
{
   //code to read from any data source and return data

}
public virtual Boolean Delete(T entity)
 {
    int entityID  = ((BaseInfo)entity).ID;
    deleteEntity(entityID);
 }

}

我将baseInfo calss作为主要业务对象实体。

并且假设我有两个业务实体(员工,学生)和两个DAL一个用于员工,一个用于学生

所以我在想的是在getAllItem中实现基于T类型返回所有​​项目的代码,所以代码可能在baseDAL中看起来像下面

public virtual List<T> GetAllItem()
{

   SPListItemCollection items = //code to read from list please note that list name saved in baseInfo object
   T.getBusinessListItems(items); //toList

}

在EmployeeDAL中我实现了SPListItemCollection与业务实体之间的映射器函数,代码将是samiliare到此

public virtual List<Employee> getBusinessListItems(SPListItemCollection items)
{

  //loop the items and fill them in list of employee objects
  return list<Employee>

}

希望这澄清一下这个案例,我不知道这是不是写作方式我不是一个技术人员。如果还有其他方法可以帮助。

2 个答案:

答案 0 :(得分:0)

不确定这是否是你想要的,但它可能会有所帮助:

object someDal = ...; //you don't know the exact type
var list = ((dynamic)someDal).GetAllItem();

C#dynamic已经为您解决了这个问题。

答案 1 :(得分:0)

最后我设法做到了, 我使用下面的代码,我认为它的反射我不确定,

public virtual List<T> GetAllItems(Type DalType)//this is baseDAL
{
  MethodInfo methodInfo = DalType.GetMethod("ConvertToBusinessEntities");
  object[] parametersArray = new object[] { itemCollection };
  object classInstance = Activator.CreateInstance(DalType, null);
  return (List<T>)methodInfo.Invoke(classInstance, parametersArray);
}

我只需要传递DalType来知道从哪个类调用该方法,如果确保所有DAL都将实现ConvertToBusinessEntities方法,我可以通过接口来管理代码。 我希望这个代码结构足够强大...... 它毕竟不是死路一条:) ,,,