【问题标题】:Calling method from generic class从泛型类调用方法
【发布时间】:2012-11-27 00:45:59
【问题描述】:

我正在构建通用共享点 DALL,所以我需要帮助。 我不知道这是否适用,但从逻辑上讲它必须是。

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

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

现在我拥有的是 baseDAL,它包括所有常见的操作,如删除、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 类作为主要业务对象实体。

假设我有两个业务实体(员工、学生)和两个 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 和业务实体之间实现了一个映射器函数,代码将与此类似

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

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

}

希望这能澄清情况,我不知道这是否是写作方式,我不是一个技术人员。如果有其他方法可以做到这一点,请帮忙。

【问题讨论】:

  • 我无法理解你的问题..你想做什么......
  • 我为 C# 添加了一个标签,因为我假设这是在 C# 中。如果不是这样,请更改它。
  • 特别是T.toList 部分!你想在这里做什么...
  • 这里的问题很不清楚;此外,除非底层数据源also 支持泛型(例如,LINQ-to-SQL 有GetTable&lt;T&gt;),否则这可能不是泛型的好用处。但是对于我能想到的大多数示例:实现不会是“通用的”,因此 generics 可能不是正确的技术选择。最后,这里的消费者很少是通用的。
  • 如果你说你应该有一个静态方法,比如Student.toList()Employee.toList(),那么再说一遍:我可能会说这不是一个很好的设计方法开头。泛型没有内置的隐喻来执行静态鸭子类型的方法。你可以通过反射来做到这一点,但是:yeuch.

标签: c# generics data-access-layer


【解决方案1】:

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

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

C#动态已经为你解决了这个问题。

【讨论】:

  • 谢谢,但我认为现在实际的实现需要是 EmployeeDAL ,这是我不需要做的。我需要将数据放在 BaseDAL 上的实现,并且 baseDAL 处理转换为基于 T 的业务类型。
【解决方案2】:

我终于成功了,, 具有相同的结构,我使用了以下代码,我认为它称为反射我不确定,,

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 方法,我可以通过接口管理该方法,则代码将起作用。 我希望这种代码结构足够强大...... 毕竟这不是死胡同:) ,,,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2019-08-26
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多