当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中将函数作为参数传递?

如何解决《如何在C#中将函数作为参数传递?》经验,为你挑选了2个好方法。

是否可以在C#中将函数作为参数传递?我可以使用Func或Action类来完成它,但这迫使我立刻声明整个函数签名.当我尝试使用Delegate时,我收到一个编译错误,说它无法将方法组转换为Delegate.

我正在研究Axial,我正试图让用户调用Web服务.我想要的是能够创建Visual Studio代理类,然后传入生成的函数.函数签名无关紧要,因为生成的代码仅使用函数名称.但是,我想传递函数而不是名称有两个原因:如果Web服务不存在或在Visual Studio中更新,则能够使用代理的Url属性和编译器错误.

public void AlertIt(object o) {
    Axial.DOM.Window.Alert(o.ToString());
}
public void CallAddService() {
    object[] param = new object[] { int.Parse(txtA.Text), int.Parse(txtB.Text) };
    Axial.ServerScript.CallWebService(new WSProxy.WS().Add, param, AlertIt, AlertIt);
}

class Axial.ServerScript {
    public void CallWebService(Delegate method, object[] param, Action successCallback, Action failureCallback) {
        // translate to javascript (already working)
    }
}

P Daddy.. 52

我想你想要的是:

static object InvokeMethod(Delegate method, params object[] args){
    return method.DynamicInvoke(args);
}

static int Add(int a, int b){
    return a + b;
}

static void Test(){
    Console.WriteLine(InvokeMethod(new Func(Add), 5, 4));
}

打印"9".



1> P Daddy..:

我想你想要的是:

static object InvokeMethod(Delegate method, params object[] args){
    return method.DynamicInvoke(args);
}

static int Add(int a, int b){
    return a + b;
}

static void Test(){
    Console.WriteLine(InvokeMethod(new Func(Add), 5, 4));
}

打印"9".


有没有办法不要求"new Func "部分代码?使用模式非常重要.
需要注意的是,使用`DynamicInvoke`会产生很大的成本 - 尽可能使用*typed*delegate和`Invoke`(快得多)
想到的唯一方法是让InvokeMethod取Func 而不是Delegate.但是,对于你将看到的Func <>的每个类型参数组合,你需要一个不同的InvokeMethod重载.

2> Jon Skeet..:

将方法组,匿名方法或lambda表达式转换为委托要求编译器知道确切的委托类型.但是,您可以使用lambda表达式和捕获的变量来使这更简单:

public void InvokeMethod(Action action)
{
    action();
}

public int Add(int a, int b)
{
    return a + b;
}

public void Test()
{    
    InvokeMethod(() => Add(2, 3));
}

这基本上会以正常方式延迟调用,但是通过将实际调用包装Add在普通Action委托中.

如果这不符合您的要求,也许您可​​以告诉我们更多关于您真正想要达到的目标.

编辑:如果这是生成的代码,您可以Func<...>使用正确的类型参数转换为 - 假设没有太多.除此之外,没有真正的方法只是传递方法组.偶尔需要一个"infoof(...)"运算符(比如typeof但对于成员来说)会给你一个MemberInfo,但实际上并不存在.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有