我想使用这样的方法:
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
的另一个参数
我该怎么办?
答案 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;
}
}