我知道我可以声明具有默认常量参数的委托,例如:
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
参数,无论它是什么。
答案 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获取默认值。