C# 在C中传递一个参数为N的方法#

C# 在C中传递一个参数为N的方法#,c#,methods,parameters,delegates,action,C#,Methods,Parameters,Delegates,Action,我有几种方法都返回void,它们具有不同的签名(参数)和不同的名称。我需要将这些方法作为参数传递给泛型方法,后者将调用它。这也需要尽可能透明 以下是我到目前为止得到的: private void button1_Click(object sender, EventArgs e) { Action<string,int> TestHandler = Test; InvokeMyMethod(TestHandler); A

我有几种方法都返回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);
    }
但你需要像这样调用它

InvokeMyMethod((Action<string, int>)Test);
invokeMethod((操作)测试);

这并不能直接回答您的问题,但以下是我解决类似问题的方法:

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 :-)
}
有这个

类似地,您可能希望有一种方法来套用其他委托类型(如
操作
)。我的方法和你的方法之间的区别在于,我的方法不是后期绑定的,但是你似乎没有使用后期绑定,所以早期绑定给了你一些编译时类型安全性

我不确定你能做到我认为你要求的。您使用一些
对象[]
调用
方法.DynamicInvoke
,但是您是如何获得这些参数的值的


为了在别人问之前回答这个问题,我创建了
Lambda.Pin
函数,因为我厌倦了犯这个错误:

Action<int> foo;
foreach (int i in someList)
    AddAction(() => foo(i));
动作foo;
foreach(someList中的int i)
AddAction(()=>foo(i));

对学员进行此操作不是最简单的吗?每个不同的签名都需要一个结构,您可以将这些参数放入其中。结构公开了一个方法,
Execute
,然后调用传递适当参数的实际方法。也许我不理解你的问题,但是当调用
TestN(“Test”,1)
时,
t3
的值应该是多少<代码>空值?如果调用失败?您的目标仅仅是摆脱显式委托类型声明吗?不清楚(至少对我来说)您是如何处理不同的签名的。似乎TestN会失败,因为t3不是可选的。在什么时候你知道参数的值是什么?假设我的方法有6个参数,我必须为该方法创建一个新的委托,这就是为什么我需要透明。如果你在将方法组转换为委托时不接受强制转换,你就倒霉了。对不起,这就是我一直在做的。这是一个巨大的麻烦,但我没有看到任何其他方式。我添加了一个链接到我的简单代码生成器。您可以随意使用它,并以任何方式更改它,因为它可能写得很糟糕。
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<int, string> foo;
Action a = foo.Pin(5, "bleh");
Action<int> foo;
foreach (int i in someList)
    AddAction(() => foo(i));