如何在Action中传递参数?

92
private void Include(IList<string> includes, Action action)
{
    if (includes != null)
    {
        foreach (var include in includes)
            action(<add include here>);
    }
}
我想这样调用它。
this.Include(includes, _context.Cars.Include(<NEED TO PASS each include to here>));

这个想法是将每个include传递给方法。


你的“Action”只是一个“Action”,还是一个“Action<T>”或其他变体?你想要多少个参数? - BoltClock
看起来您已经通过 includes 参数传递了包含项。您的想法是要将 includes 列表中的每个成员传递给 action 吗?如果是这样,请只传递 _context.Cars.Include(不带括号)。 - itowlson
是的,想法是将每个包含项传递给方法_context.Cars.Include()。 - Jop
你看到了什么错误? _context.Cars.Include 方法的签名是什么?Scrum Meister 的更新答案看起来对我来说是正确的,但我猜想 Cars.Include 方法可能需要适应一个字符串...? - itowlson
出现错误:'System.Data.Objects.ObjectQuery<Repository.Entity.Car> System.Data.Objects.ObjectQuery<Repository.Entity.Car>.Include(string)' 返回类型不正确。签名应为:public ObjectQuery<T> Include(string path); - Jop
3个回答

140

如果您知道要传递的参数,可以使用类型为Action<T>的方法。例如:

void LoopMethod (Action<int> code, int count) {
     for (int i = 0; i < count; i++) {
         code(i);
     }
}

如果您希望参数传递到方法中,那么请将该方法设置为通用方法:
void LoopMethod<T> (Action<T> code, int count, T paramater) {
     for (int i = 0; i < count; i++) {
         code(paramater);
     }
}

同时,以下是调用者的代码:

Action<string> s = Console.WriteLine;
LoopMethod(s, 10, "Hello World");

更新。你的代码应该像这样:

更新你的代码如下:

private void Include(IList<string> includes, Action<string> action)
{
    if (includes != null)
    {
         foreach (var include in includes)
             action(include);
    }
}

public void test()
{
    Action<string> dg = (s) => {
        _context.Cars.Include(s);
    };
    this.Include(includes, dg);
}

将每个include传递给方法_context.Cars.Include()的想法。 - Jop
使用此代码(来自更新),出现错误:“System.Data.Objects.ObjectQuery<Repository.Entity.Car>.Include(string)” 具有错误的返回类型。 - Jop
@jop 更新,构建一个新的 Action<string> 委托,调用 Cars.Include。或者,您的自定义 Include 方法可以接受一个 Func<string, Cars.Include() 返回的任何类型> - The Scrum Meister
惯例是通用变量应该有名为arg的参数T,而不是参数。 - magnusarinell

19

诡计:您可以使用lambda表达式来传递任何代码,包括带参数的调用。

this.Include(includes, () =>
{
    _context.Cars.Include(<parameters>);
});

2
我喜欢这个,因为我已经在许多地方使用了一个实用类,而该类不接受 Action <T> - 这使我无需修改就可以继续使用它。 - GregHNZ
1
这应该是被接受的答案,但它太简单了。 - Chris
这是我使用的东西,利用一个BlockingCollection来模拟我在C++/Qt中使用的(signal/slot机制)。 - Aminos

19
你需要的是带参数的,请参考Action<T>

你可能想要添加第二个 T - SLaks
将每个include传递给方法_context.Cars.Include()的想法。 - Jop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接