作为方法调用参数

All*_*ano 4 c# methods delegates function invoke

我有一个简单的问题,可能很容易回答,但谷歌的强烈使用没有提出我的问题的答案.所以我道歉,如果有正确的解决方案,我没有看到它.

如果我有一个类似的方法调用

Object.Add(string text, System.Drawing.Color color);
Run Code Online (Sandbox Code Playgroud)

这是一些文本添加到具有指定颜色的某个对象,我想动态地改变颜色,然后我可以输入某个.喜欢

Object.Add("I'm a string", SomeBool ? Color.Red : Color.Green);
Run Code Online (Sandbox Code Playgroud)

这非常有用,但只要我想比较两个案例就会失败.

我正在寻找的东西是(伪代码)

Object.Add("I'm another string", new delegate (Sytem.Drawing.Color) 
{
    if (tristate == state.state1) 
    {
        return Color.Blue;
    } 
    else if (tristate == state2)
    {
        return Color.Green;
    }
    // ...
});
Run Code Online (Sandbox Code Playgroud)

但无论我在尝试什么,它都会引发编译错误.

我尝试了很多关于如何将函数作为方法参数传递的谷歌,但我会发现很多

public void SomeFunction(Func<string, int> somefunction) 
{ 
    //... 
}
Run Code Online (Sandbox Code Playgroud)

这不是我的问题.

谢谢 :)

pok*_*oke 5

只需将您的逻辑放在首位:

Color color;

if (tristate == state1) 
    color = Color.Blue;
else if (tristate == state2)
    color = Color.Green;
else
    color = Color.Red;

Object.Add("I'm a string", color);
Run Code Online (Sandbox Code Playgroud)

你的delegate解决方案不起作用的原因很简单,它new delegate (Sytem.Drawing.Color) { … }返回一个函数委托,需要在获得颜色值之前先调用它.并且由于您的方法需要颜色而不是返回颜色的方法,因此它并不真正有用.

根据你的逻辑有多短,你仍然可以在这里使用三元条件运算符并简单地链接它:

Object.Add("I'm a string", tristate == state1 ? Color.Blue : tristate == state2 ? Color.Green : Color.Red);
Run Code Online (Sandbox Code Playgroud)

这相当于上述冗长的if/else if/else结构.但当然,它不一定更具可读性,因此请谨慎使用并选择更具可读性的解决方案.