将没有参数的动作调整为action<;T>;

本文关键字:action gt lt 调整 参数 | 更新日期: 2023-09-27 18:00:05

我有这个方法

private void ProcessItem<T>(FileSystemInfo itemInfo, int itemMinAge, Action<T> action, T parameter, string errorMessage, string successMessage = "")

它适合我8个电话中的7个,例如

ProcessItem<bool>(subDir, dir.MinAge, subDir.Delete, true, string.Format(Messages.NotDeletedFolder, subDir.FullName));

获取目录并且然后如果dir.MinAge满足某些标准则在该目录上调用subDir.Delete(true)并记录消息。但我也有一个调用,其中参数action需要不带<T>参数,因为我需要传递一个不带任何参数的void方法。

有没有一种方法可以将这个调用放入这个方法中?我不想仅仅因为一个调用就创建另一个方法。

将没有参数的动作调整为action<;T>;

ProcessItem<object>(subDir, dir.MinAge,
    ignored => subDir.NoArgs(),
    /* ignored */ null,
    string.Format(Messages.NotDeletedFolder, subDir.FullName));
ProcessItem<bool>(subDir, dir.MinAge, _ => ParameterlessCall() , true, ...

在lambda表达式中使用_作为参数名称是一种函数式编程习惯用法,用于从不需要检查其值的参数。

最简单的方法可能只是使用lambda表达式。

ProcessItem<bool>( ... (param) => myMethod(), ... );

在这种情况下,参数param将被简单地忽略,并且myMethod将被正常调用。

创建一个可选参数并相应地调整实现:

private void ProcessItem<T>(FileSystemInfo itemInfo, int itemMinAge, Action<T> action = null, Action action2 = null, T parameter, string errorMessage, string successMessage = "")