2011-08-17 44 views
3

我知道我可以声明具有默认常量参数如代表:C#代表与不同的可选参数的方法

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

如果我理解正确,您的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 ... 
    ... 
} 
+0

那一个能工作,但有没有更好,更正式/模块化的方法呢?我正在寻找一些我不添加'skip => Method(skip:skip);'并且能够'不知何故'直接调用myFunc指向的方法,而无需包装另一个lambda。当然,如果这是可能的:) –

+0

@canpoyrazoğlu:这是不可能的。如果你想使用一些默认参数,那么方法'FirstMethod','SecondMethod'等必须被调用_explicitly_,因为只有在那些调用位置是编译器插入的默认参数。所以唯一的办法就是围绕他们环绕 – JBSnorro

+0

好的,我会继续打包。但仍然不知道为什么它不能完成,因为签名是'硬编码'的,没有泛型或任何类型的任何类型的变体,并且如果编译器知道参数的确切顺序和类型,逻辑上应该是一种方式进入那个。但我仍然会使用包装。 –

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); 

等..

+0

问题是我不想触摸我调用的方法的另一个参数(第一个参数)。 –

1

你的要求,即委托具有取决于它调用无法做到的方法有多种可选参数。可选参数通过在编译时重写方法的调用位置来实现。如果代理指向的方法在运行时确定,它将在编译时编写什么? Eric Lippert的optional arguments系列非常有启发性。

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

+0

我现在看到..但我不想进入反思,我只是去与包装解决方案。 –