簡體   English   中英

將未知參數添加到泛型方法內的 Func

[英]Add unknown parameter to a Func inside a generic method

我在網上查看了很多資源,但我認為這是不可能的,或者我從錯誤的角度接近它。

我正在從子表生成一個 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;
}
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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM