gpt4 book ai didi

c# - 在 C# 中传递一个带有 N 个参数的方法作为参数

转载 作者:行者123 更新时间:2023-11-30 22:40:27 25 4
gpt4 key购买 nike

我有几种方法都以不同的签名(参数)和不同的名称返回 void。我需要将这些方法作为参数传递到稍后将调用它的通用方法中。此外,这需要尽可能透明。

按照我到目前为止所得到的:

    private void button1_Click(object sender, EventArgs e)
{
Action<string,int> TestHandler = Test;
InvokeMyMethod(TestHandler);

Action<string, int,object > TestHandlerN = TestN;
InvokeMyMethod(TestHandlerN);
}
public void InvokeMyMethod(Delegate Method)
{
object[] args = new object[X];
Method.DynamicInvoke();
}

public void Test(string t1, int t2)
{
MessageBox.Show(t1 + t2);
}

public void TestN(string t1, int t2, object t3)
{
MessageBox.Show(t1 + t2);
}

这就是我需要的:

    private void button1_Click(object sender, EventArgs e)
{
InvokeMyMethod(Test);
InvokeMyMethod(TestN);
}

public void InvokeMyMethod(XXX_Type Method)
{
object[] args = new object[X];
Method.DynamicInvoke(args);
}

public void Test(string t1, int t2)
{
MessageBox.Show(t1 + t2);
}

public void TestN(string t1, int t2, object t3)
{
MessageBox.Show(t1 + t2);
}

最佳答案

这并没有直接回答你的问题,但这是我解决类似问题的方法:

public static partial class Lambda
{
public static Action Pin<T0>
(
this Action<T0> action,
T0 arg0
)
{
return () => action(arg0);
}

public static Func<TResult> Pin<T0, TResult>
(
this Func<T0, TResult> func,
T0 arg0
)
{
return () => func(arg0);
}

public static Action Pin<T0, T1>
(
this Action<T0, T1> action,
T0 arg0,
T1 arg1
)
{
return () => action(arg0, arg1);
}

public static Func<TResult> Pin<T0, T1, TResult>
(
this Func<T0, T1, TResult> func,
T0 arg0,
T1 arg1
)
{
return () => func(arg0, arg1);
}

// More signatures omitted for brevity...
// I would love it if C# supported variadic template parameters :-)
}

这个想法是,如果你有一个 Action这需要参数,你可以说:

Action<int, string> foo;
Action a = foo.Pin(5, "bleh");

code generator .

同样,您可能希望有一种方法可以柯里化(Currying)到其他一些委托(delegate)类型(例如 Action<string, int> )。我的方法和你的方法之间的区别在于我的方法不是后期绑定(bind),但你似乎并没有使用后期绑定(bind),所以早期绑定(bind)为你提供了一些编译时类型安全性。

我不确定您能否按照我认为的要求进行操作。你打电话method.DynamicInvoke与一些object[] ,但是您如何获得这些参数的值?


为了在任何人问之前回答这个问题,我创建了 Lambda.Pin功能,因为我厌倦了犯这个错误:

Action<int> foo;
foreach (int i in someList)
AddAction(() => foo(i));

关于c# - 在 C# 中传递一个带有 N 个参数的方法作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197987/

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