在通用方法内将未知参数添加到Func

时间:2019-11-11 11:15:24

标签: c# generics asp.net-core

我在网上查看了许多资源,但我认为这是不可能的,或者我是从错误的角度进行研究的。

我正在从子表中生成ID列表,并确定父表中的外键ID是否包含在子ID列表中。例如j =>!ids.Contains(j.InvestorId)。下面的代码将不会编译,因为whereFilter无法接受参数,但是您可以看到我想要的效果。

希望有一种方法可以代替预先获取ID并将附加参数传递给whereFilter。

public List<int> ValidateReferentialIntegrity<TChild, TParent>(string childFilePath, 
    string parentFilePath, 
    Func<TParent, int, bool> whereFilter, 
    Func<TParent, int> selector) 
{
    var childList = ReadCsvFile<TChild>(typeof(TChild).Name, childFilePath);
    var parentList = ReadCsvFile<TParent>(typeof(TParent).Name, parentFilePath);

    var ids = childList.Select(s => (int)s.GetId()).ToList();
    var unidentifiableIds = parentList.Where(whereFilter(ids))
        .Select(selector).ToList();
    return unidentifiableIds;
}

1 个答案:

答案 0 :(得分:1)

public List<int> ValidateReferentialIntegrity<TChild, TParent>(string childFilePath, 
    string parentFilePath, 
    Func<TParent, IList<int>, bool> whereFilter,  // <- change #1 is here, IList<int>
    Func<TParent, int> selector) 
{
    var childList = ReadCsvFile<TChild>(typeof(TChild).Name, childFilePath);
    var parentList = ReadCsvFile<TParent>(typeof(TParent).Name, parentFilePath);

    var ids = childList.Select(s => (int)s.GetId()).ToList();
    var unidentifiableIds = parentList
        .Where(p => whereFilter(p, ids))    // <- change #2 is here, pass object to whereFilter
        .Select(selector)
        .ToList();
    return unidentifiableIds;
}

并这样称呼它:

var list = ValidateReferentialIntegrity<TChild, TParent>(
    "file1.csv", 
    "file2.csv", 
    (TParent parent, IList<int> childIds) => childIds.Contains(parent.InvestorId),
    parent => parent.InvestorId);