C#的委托方法可以采用隐式类型参数吗?

时间:2010-10-03 21:05:24

标签: c# delegates arguments implicit

我很好奇是否可以使用隐式类型参数创建委托方法。这就是我想要完成的事情。这种事情不会为我编译,但它应该让你知道我想要完成的事情。

这是我想用委托调用的函数:

class MyClass
{
    ArrayList function1(int param1, int param2)
    {
        ...do something...
    }
    ArrayList function2(string param3)
    {
        ...do something...
    }
}

以下是调用它们的类:

class MyOtherClass
{
    delegate ArrayList delFunc(params object[] args);

    myOtherClass()
    {
        MyClass myClassInstance = new myClass();
        delFunc myDelFunc1 = myClassInstance.function1;
        delFunc myDelFunc2 = myClassInstance.function2;

        myDelFunc1(1,2);
        myDelFunc2("hello world");
    }


}

显然在这个例子中你实际上只是调用提供的函数。我实际上要做的是创建一个包装器函数,它允许您提供一个函数作为具有任何可能的参数列表的委托。

我能想出的唯一解决方案是让MyClass中的函数也使用参数列表。但是,这会让任何直接调用这些函数的人感到非常困惑。这就是我的意思:

class MyClass
{
    ArrayList function1(params object[] args)
    {
        ...do something...
    }
    ArrayList function2(params object[] args)
    {
        ...do something...
    }
}

现在它编译,但我需要猜测,或者阅读评论,找出传递给function1和function2的内容。此外,它一旦在编译时失败,它现在在运行时失败。所有非常糟糕的事情......

我认为可能有一些语法因为做这样的事情而缺少

delegate ArrayList delFunc(MatchAnyArgumentSignature);

干杯, 罗布

1 个答案:

答案 0 :(得分:1)

只需使用Action< T>或动作< T1,T2,.....> :

public void Something(int arg1, int arg2, int arg3) {
  ...
}

以及方法内的任何位置:

Action<int, int, int>  call = Something; 
call(1, 2, 3);

在这种情况下你不能使用var。

无论如何,你不应该再使用ArrayList了。

编辑:

如果这些代表应该返回一些东西,那就有Func&lt; TResult&gt;,Func&lt; T1..TN,TResult&gt;