C#代表具有不同可选参数的方法

时间:2011-08-17 22:52:07

标签: c# delegates optional-parameters

我知道我可以声明具有默认常量参数的委托,例如:

delegate void MyDelegate(int x, int y = 5);

然后使用与签名匹配的任何方法在任何地方调用它。

好的,我有很多这样的方法声明:

public Something FirstMethod(float val = 10, int skip = 0){ ... return sth; }
public Something SecondMethod(float val = 20, int skip = 0){ ... return sth; }
public Something ThirdMethod(float val = 5, int skip = 0){ ... return sth; }

......这个列表一直向下,无论如何,它们都有这个签名结构。这里的要点是,它们都有浮点参数,默认为不同的东西。

然后,我想创建一个指向其中一个方法的委托:

delegate Something ProblematicDelegateType(<<WHAT WILL GO HERE>>);
ProblematicDelegateType myFunc;
if(someValue == someParameter){
    myFunc = FirstMethod;
}else if(...){
    myFunc = SecondMethod;
}else...
...
}

myFunc();
myFunc(skip:100);

我希望能够以无参数或myFunc参数调用skip。在这部分代码中,不使用第一个参数val。 (它们在别处使用)。

委托人的论点清单会怎样?我想保留该方法的默认val参数,无论它是什么。

3 个答案:

答案 0 :(得分:3)

如果我理解正确,您的myFunc将完全省略val参数,始终使用您最终调用的方法的默认值,是否正确?

如果是这样,这应该可以实现您的目标:

delegate Something ProblematicDelegateType(int skip = 0);
ProblematicDelegateType myFunc;
if (someValue == someParameter) {
    myFunc = skip => FirstMethod(skip: skip);
} else if (...) {
    myFunc = skip => SecondMethod(skip: skip);
} else ...
    ...
}

答案 1 :(得分:1)

使用lambda绑定所需的值。默认值实际上是重载,它们将您想要的值绑定到函数参数。由于你有各种各样的if分离出函数,只需将委托传递给只接受整数的函数。

换句话说,

delegate Something ProblematicDelegateType(int skip = 0)

//...

ProblematicDelegateType myDelegate;
if (someCondition)
  myDelegate = (_1) => FirstMethod(10, _1);
else if (someOtherCondition)
  myDelegate = (_1) => SecondMethod(20, _1);

依旧......

答案 2 :(得分:1)

您的要求是委托具有可选参数,该参数因其调用的方法而异。可选参数通过在编译时重写方法的调用站点来实现。如果委托指向的方法在运行时确定它在编译时会写什么? Eric Lippert关于optional arguments的系列节目非常具有启发性。

但是,您也可以考虑使用反射来获取默认值。使用MethodInfo.GetParameters()获取参数信息,使用ParameterInfo.DefaultValue获取默认值。