消除Func和Action引入的重复代码

本文关键字:代码 Func Action 消除 | 更新日期: 2023-09-27 18:24:29

有一个具有返回类型的泛型函数。

TResult Invoke<TResult>(Func<string, TResult> callback)
{
    string message = Generate_some_string();
    return callback(message);
}

还有一个类似的没有返回类型的,因为没有Func。

void Invoke(Action<string> callback)
{
    string message = Generate_some_string();
    callback(message);
}

但这些是重复的代码。一旦Invoke发生更改,Invoke就必须相应地进行更改。有什么方法可以消除重复的代码吗?

谢谢,Jim

消除Func和Action引入的重复代码

你可以试试这样的东西:

void Invoke(Action<string> callback)
{
    Invoke<int>(s=>{callback(s);return 0;});
}

这样,所有的逻辑都保持在Func版本中,而Action版本永远不应该更改。

另一种选择是创建一个ToFunc转换例程,并让调用者有责任将其操作更改为函数:

public static Func<TIn, TResult> ToFunc<TIn, TResult>(this Action<TIn> a)
{
    return input =>
    {
        a(input);
        return default(TResult);
    };
}