Добавить неизвестный параметр в Func внутри универсального метода - PullRequest
0 голосов
/ 11 ноября 2019

Я просмотрел много ресурсов онлайн, но думаю, что это что-то не возможно, или я подхожу к этому с неправильной точки зрения.

Я создаю список идентификаторов из дочерней таблицы и определяю, является ли чужойКлючевой идентификатор в родительской таблице содержится в списке дочерних идентификаторов. например, j =>! ids.Contains (j.InvestorId). Приведенный ниже код не будет компилироваться, так как whereFilter не может принимать параметр, но вы можете увидеть эффект, который я хотел бы.

Надеемся, что есть способ вместо получения идентификаторов заранее и передачи дополнительного параметра в 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 Ответ

1 голос
/ 11 ноября 2019
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...