Извлечь аргумент из Action<T>

158
18 апреля 2018, 05:47

Пишу метод поиска по фильтру.
Фильтр представлен в виде отдельного класса.
Хочется иметь возможность не просто скормить экземпляр фильтра, но и пользоваться следующими конструкциями:

public static SearchResult GetByFilter(string searchString)
{
    return GetByFilter(f =>
    {
        f.SearchString = searchString;
        f.Score = 7;
        f.Page = 2;
    });
}

Чтобы оно заработало, как я понял, в качестве аргумента должен выступать Action<FilterClass>, но вот как потом извлекать этот объект фильтра для использования в методе я не нашёл.

public static SearchResult GetByFilter(Action<FilterClass> filter)
{
    //Вот тут надо как-то получить тот самый объект, 
    //который мы изменяем в предыдущем примере,
    //чтобы получить строку для url запроса,
    //которую формирует класс фильтра на основе своих свойств.
}

Может я вообще не туда забрёл и мне нужен другой тип аргумента? Подскажите как описать класс, чтобы работали подобного рода конструкции.

Вот в качестве примера обычная реализация этого метода:

public static SearchResult GetByFilter(FilterClass filter)
{
    return Api.Get<SearchResult>("/search/" + filter.buildQuery());
}
Answer 1
public static SearchResult GetByFilter(Action<FilterClass> filter)
{
    FilterClass filterParams = new FilterClass();
    filter(filterParams);
    // в этой точке у вас будет измененный filterParams
    return Api.Get<SearchResult>("/search/" + filterParams.buildQuery());
}
Answer 2

Не очень понятно, где создается ваш FilterClass, но как пример

public static SearchResult GetByFilter(string searchString)
{
    return GetByFilter(() =>
    {
        var f = new FilterClass();
        f.SearchString = searchString;
        f.Score = 7;
        f.Page = 2;
        return f;
    });
}

public static SearchResult GetByFilter(Func<FilterClass> factory)
{
    return Api.Get<SearchResult>("/search/" + factory().buildQuery());
}
READ ALSO
Поиск индекса элемента List по значению

Поиск индекса элемента List по значению

Есть List<Student> students со свойствами:

157
Чем можно заменить WebBrowser C#?

Чем можно заменить WebBrowser C#?

Всем приветЧем в C# можно заменить WebBrowser? Кроме Awesomium

185
C# Photon - Проблема с RPC

C# Photon - Проблема с RPC

Не могу понять, если у меня два PunRPC метода в 1 скрипте, то если я вызываю первый метод у Мастер клиента, а второй уже у клиента(который отправил),...

165
Название с LIst добавить в ComboBox

Название с LIst добавить в ComboBox

Всем хай Вообщем проблема небольшая Как можно Doc передать в функцию AddData? Я просто через вторую форму даю Doc какой то текст, но оно далее не присваивает...

176