0

在 EF 4 vs 2010 上工作。在扩展方法上面临问题。需要帮助来编写扩展方法。

private void FillBillTaxOnSave(BillController objController, List<BilBillTAX> _entityTax, BilBillMaster objEntity)
        {
            foreach (BilBillTAX itemTax in _entityTax.FindAll(item => item.Action != Entity.ActionMode.Delete))
            {
                BilBillDetail tempDetail = objEntity.BilBillDetails.FirstOrDefault(item => item.BillDetailID == itemTax.BillDetailID);
                if (tempDetail != null)
                {
                    if (itemTax.Action == XERP.Entity.ActionMode.Add)
                    {
                        tempDetail.BilBillTAXes.Add(itemTax);
                    }                    
                }
            }
        }

想为上述语法编写扩展方法。

BilBillMaster objEntity = new BilBillMaster();
            List<TransactionItem> oList = new List<TransactionItem>();
            oList.SetSave(objEntity, item => item.Action != Entity.ActionMode.Delete, objEntity.BilBillDetails);

我的扩展方法

public static IEnumerable<TSource> SetSave<TSource, T, TSourceDetail>(this IEnumerable<TSource> source, T entObj, Func<TSource, bool> predicate, IEnumerable<TSourceDetail> sourceDetail)
        {
            List<TSource> list = new List<TSource>();

            foreach (var element in source.Where(predicate))
            {

                if (element.Action == XERP.Entity.ActionMode.Add)
                {
                    sourceDetail.Add(element);
                }               
            }
            return list;
        }

我上面的语法下面部分显示错误。

        if (element.Action == XERP.Entity.ActionMode.Add)
        {
            sourceDetail.Add(itemTax);
        }

如果有任何疑问,请在高级中询问。谢谢。帮助我比较扩展方法中的值。

错误消息是:

2)  does not contain a definition for 'Add' and no extension method 'Add' accepting a first argument of type 'System.Collections.Generic.IEnumerable<TSourceDetail>' could be found
4

1 回答 1

2

您编写的 Extension 方法不知道 TSource 类型。为了让它能够理解,您需要指定一个约束来限制您想要的 TSource 的类型。

在您提供的示例中,您应该添加如下内容。

public static IEnumerable<TSource> SetSave<TSource, T, TSourceDetail>(this IEnumerable<TSource> source, T entObj, Func<TSource, bool> predicate, IEnumerable<TSourceDetail> sourceDetail) where TSource : TransactionItem
{
    //Your logic goes here
}
于 2013-10-03T05:03:02.677 回答