gpt4 book ai didi

c# - 将 Action<.., .., T > 作为没有预定义数量的 Action 参数的参数传递

转载 作者:太空宇宙 更新时间:2023-11-03 19:58:24 25 4
gpt4 key购买 nike

我有以下代码:

public doSomething(List<Int64> data, Int64 counter){
//Do something
}

public doSomethingNext(List<Int64> data, String Something){
//Do something next
}

public static void Loop<T>(Action<T> action) {
//Do something before
action(T);
}
}

是否有可能以这种通用方式编写 Loop 方法,以便我可以传递每个方法而不管方法的参数如何。像这样:

Loop(doSomething,....?);
Loop(doSomethingNext,...?);

@Edit 19:40 24-06-2015 更多信息

对不起' Action (T);'部分生成 T 未知的错误。但是我把它填在那里,因为我不知道如何让它工作。

当我使用以下代码时,它与 Linq 一起工作:

//Method
public static void Loop(Action action) {
//Do something before
action();
}
}

//Call
Loop(() => doSomething(data, counter));

但是我很好奇它是否也可以在没有 Linq 的情况下工作? (用 < T > 之类的东西)

(附带问题,是否可以访问Loop函数中方法的参数?)

最佳答案

你可以将一个Delegate作为参数...比如:

public static void Loop<T>(Delegate action) {
}

但是你必须

action.DynamicInvoke(someparameters);

所以使用反射来调用它......你会使用什么参数?


通常如果调用者“固定”和“选择”参数,这个问题用partial application解决。 :

public static void Loop(Action action)
{
action();
}

你可以像这样使用它:

Loop(() => Console.WriteLine("Hello"));

此处 Console.WriteLine() 有一个参数,但它由调用者通过创建另一个方法(匿名方法)固定,该方法具有 0 个参数,类型为 的委托(delegate) Action 被创建。

虽然您不需要从委托(delegate)中删除所有参数:

public static void Loop<T>(Action<T> action)
{
// generate some T value
T value = GetValue<T>();

// call action with a T parameter
action(value);
}

然后:

Loop((int x) => Console.WriteLine("Some number: {0}", x));

在这种情况下,Console.WriteLine() 使用两个参数,其中一个已固定(“Some number: {0}”),另一个保留真正可变的 (x)。

关于c# - 将 Action<.., .., T > 作为没有预定义数量的 Action 参数的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com