将没有参数的动作放入Action <t> </t>

时间:2013-02-19 17:15:02

标签: c# generics

我有这个方法

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方法而不带任何参数。

有没有办法让这一个调用适合这个方法?我不想仅仅因为一次调用而创建另一种方法。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

ProcessItem<bool>(subDir, dir.MinAge, _ => ParameterlessCall() , true, ...

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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