使用带有更多参数的方法作为带有更少参数的动作

时间:2019-05-19 19:04:35

标签: c# .net-core asp.net-core-2.1

我想使用这样的方法:

public void A(Action<Action<string>> x)
{
    for (int i = 0; i < 10; i++)
    {
        x.Invoke(data => {
             Console.WriteLine($"{data} --- {i}");
        });
    }
}

这里的想法是,(此方法的)用户将输入另一种方法,该方法可以从偏好的数据源生成字符串。
假设我想为用户提供一些内置解决方案作为静态方法:

public void B(string fileName, Action<string> y)
{
     // process fileName
     string data = C(fileName);
     // invoke inner action
     y.Invoke(data);
}

用例为:

A(B("/home/user1"));

与此有关的问题是B仍然需要fileName的另一个参数
我该怎么办?

1 个答案:

答案 0 :(得分:0)

我在输入时发现了这个问题...
我真正需要使用的是Func<T>,而不是Action<Action<T>>
示例:

public void A(Func<string> x)
{
    for (int i = 0; i < 10; i++)
    {
        var data = x.Invoke();
        Console.WriteLine($"{data} --- {i}");
    }
}

public string B(string fileName)
{
     // process fileName
     string data = C(fileName);
     return data;
}

public void Main()
{
    A(B("home/user1"));
}

我不能刚刚将string生成的A传递给B,例如:

public void A(string data)

因为这不允许更改B中的数据源(B可以根据其他参数更改数据源-例如,如果B选择了带前缀的随机文件fileName

编辑:这仍然行不通!问题在于,通过调用B,我们肯定不会传递B作为参数,而是传递B的返回类型。
就我而言,B的输入源的更改是无关紧要的,一种适当的解决方案是将B更改为:

public IEnumerable<string> B(string fileName)
{
    foreach (var line in File.ReadAllLines("fileName"))
    {
         yield return line;
    }
}