OK, async je v tomto případě zbytečné.
Generikum potřebuju, protože každé API, což jsem zapoměl napsat, že jich máme víc a každý s vlastním odvozeným requestem, vrací pokaždé jinou response.
Mám to jako zjednodušený příklad takto:
public class MultipleRequest
{
public MultipleRequest(int take, int skip)
{
Take = take;
Skip = skip;
}
public int Take { get; set; }
public int Skip { get; set; }
}
public class SearchByNameRequest : MultipleRequest
{
public SearchByNameRequest(string name, int take = 50, int skip = 0)
: base(take, skip)
{
Name = name;
}
public string Name { get; set; }
}
public class PaginationHelper<TR>
{
public delegate Task<TR> SearchMethodDelegate(MultipleRequest multipleRequest);
public static async Task<TR> GetResultFromSearchAsync(SearchMethodDelegate task, Func<TR,bool> checker, int paging = 50)
{
int take = paging;
int skip = 0;
TR getterValue;
do
{
var parameterInfo = task.Method.GetParameters()[0];
var properties = parameterInfo.ParameterType.GetProperties();
// zmena take v requestu
// zmena skip v requestu
getterValue = await task.Invoke(??????????????);
skip += take;
} while (!checker.Invoke(getterValue));
return getterValue;
}
}
Volám to takhle:
public async Task Run()
{
await PaginationHelper<string>.GetResultFromSearchAsync(
async (r) => await SearchMethod(new SearchByNameRequest("Bill Clinton")),
res => res != null,
50);
}
public async Task<string> SearchMethod(SearchByNameRequest multipleRequest)
{
return "Bill Clinton";
}
Tzn. v instanci toho delegátu už instance requestu je, jen nevím, v místě, kde jsou otazníky, jak ji dosadit.