我有一个类似的方法
private async Task LoadInitialDataAsync(Func<Task> action, string name)
{
logger.LogTrace($"Loading {name}...");
await action.Invoke();
}
我怎样才能避免像这样传递我正在加载的内容:
await LoadInitialDataAsync(
serviceProvider.GetRequiredService<NeighboursMilk>().LoadInitialDataAsync,
"neighbours milk");
await LoadInitialDataAsync(
serviceProvider.GetRequiredService<MyOldSockCollection>().LoadInitialDataAsync,
"My old sock collection");
await LoadInitialDataAsync(
serviceProvider.GetRequiredService<NewJamesBondDvds>().LoadInitialDataAsync,
"New james bond dvds");
以下测试获取“task”与“NeighboursMilk”同一个类中的名称。
public class Test
{
private readonly ILogger logger;
private readonly IServiceProvider serviceProvider;
public Test(ILogger<Test> logger,IServiceProvider serviceProvider)
{
this.logger = logger;
this.serviceProvider = serviceProvider;
}
private async Task LoadInitialDataAsync(Func<Task> action)
{
var name = action.GetMethodInfo().DeclaringType.Name;
logger.LogInformation($"Loading {name}...");
await action.Invoke();
}
public async Task Load()
{
await LoadInitialDataAsync(serviceProvider.GetRequiredService<NeighboursMilk>().LoadInitialDataAsync);
}
}
public class NeighboursMilk
{
public Func<Task> LoadInitialDataAsync = myTask;
public static Task myTask()
{
return Task.CompletedTask;
}
}
试运行
test.Load()