作为方法调用参数的函数
Function as method call parameter
我有一个可能很容易回答的简单问题,但大量使用 google 并没有为我的问题提供答案。因此,如果有正确的解决方案但我没有看到,我深表歉意。
如果我有一个像
这样的方法调用
Object.Add(string text, System.Drawing.Color color);
那是用指定的颜色向某个对象添加一些文本,我想动态改变颜色,然后我可以输入某事。喜欢
Object.Add("I'm a string", SomeBool ? Color.Red : Color.Green);
这很有用,但一旦我想比较两个以上的案例时就会失败。
我正在寻找的是(伪代码)
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;
}
// ...
});
但无论我尝试什么,它都会引发编译器错误。
我尝试了很多 google 关于如何将函数作为方法参数传递的方法,但我发现很像
public void SomeFunction(Func<string, int> somefunction)
{
//...
}
这不是我的问题。
谢谢:)
把你的逻辑放在第一位:
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);
您的 delegate
解决方案不起作用的原因很简单,就是 new delegate (Sytem.Drawing.Color) { … }
returns 需要先调用函数委托,然后才能获得颜色值。由于您的方法需要一种颜色,而不是 returns 一种颜色的方法,因此它并没有多大帮助。
根据您的逻辑有多短,您仍然可以在此处使用三元条件运算符并简单地链接它:
Object.Add("I'm a string", tristate == state1 ? Color.Blue : tristate == state2 ? Color.Green : Color.Red);
这相当于上面的冗长 if/else if/else
结构。但当然,它不一定更可读,所以谨慎使用并选择更可读的解决方案。
我建议使用词典,例如
private static Dictionary<State, Color> s_Colors = new Dictionary<State, Color>() {
{State1, Color.Blue},
{State2, Color.Green},
{State3, Color.Red},
};
...
Object.Add("I'm a string", s_Colors[tristate]);
这将使您可以传递一个函数来决定状态,并将颜色传递到一个动作中,然后您可以决定要做什么。实际上,文本和颜色只能在 Add 方法内部使用,根本不需要返回使用,但这只是您正在寻找的一个示例。因为您没有在 Add 方法中使用文本(在您的示例中以任何方式)我将其取出并且它只能在操作内部使用,否则只需将其添加回去并在 Add 方法内部使用它。
void Main()
{
Object.Add(() => SomeState.State2, (col) =>
{
Label1.Text = "Your text";
//Do something with color
Label1.BackColor = col;
});
//example 2
Object.Add(() =>
{
return someBool ? SomeState.State1 : SomeState.State2;
},
(col) =>
{
Label1.Text = "Your text";
//Do something with color
Label1.BackColor = col;
});
}
public static class Object
{
public static void Add(Func<SomeState> func, Action<Color> action)
{
switch(func())
{
case SomeState.State1:
action(Color.Blue);
break;
case SomeState.State2:
action(Color.Green);
break;
default:
action(Color.Black);
break;
}
}
}
public enum SomeState
{
State1,
State2
}
我有一个可能很容易回答的简单问题,但大量使用 google 并没有为我的问题提供答案。因此,如果有正确的解决方案但我没有看到,我深表歉意。
如果我有一个像
这样的方法调用Object.Add(string text, System.Drawing.Color color);
那是用指定的颜色向某个对象添加一些文本,我想动态改变颜色,然后我可以输入某事。喜欢
Object.Add("I'm a string", SomeBool ? Color.Red : Color.Green);
这很有用,但一旦我想比较两个以上的案例时就会失败。
我正在寻找的是(伪代码)
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;
}
// ...
});
但无论我尝试什么,它都会引发编译器错误。
我尝试了很多 google 关于如何将函数作为方法参数传递的方法,但我发现很像
public void SomeFunction(Func<string, int> somefunction)
{
//...
}
这不是我的问题。
谢谢:)
把你的逻辑放在第一位:
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);
您的 delegate
解决方案不起作用的原因很简单,就是 new delegate (Sytem.Drawing.Color) { … }
returns 需要先调用函数委托,然后才能获得颜色值。由于您的方法需要一种颜色,而不是 returns 一种颜色的方法,因此它并没有多大帮助。
根据您的逻辑有多短,您仍然可以在此处使用三元条件运算符并简单地链接它:
Object.Add("I'm a string", tristate == state1 ? Color.Blue : tristate == state2 ? Color.Green : Color.Red);
这相当于上面的冗长 if/else if/else
结构。但当然,它不一定更可读,所以谨慎使用并选择更可读的解决方案。
我建议使用词典,例如
private static Dictionary<State, Color> s_Colors = new Dictionary<State, Color>() {
{State1, Color.Blue},
{State2, Color.Green},
{State3, Color.Red},
};
...
Object.Add("I'm a string", s_Colors[tristate]);
这将使您可以传递一个函数来决定状态,并将颜色传递到一个动作中,然后您可以决定要做什么。实际上,文本和颜色只能在 Add 方法内部使用,根本不需要返回使用,但这只是您正在寻找的一个示例。因为您没有在 Add 方法中使用文本(在您的示例中以任何方式)我将其取出并且它只能在操作内部使用,否则只需将其添加回去并在 Add 方法内部使用它。
void Main()
{
Object.Add(() => SomeState.State2, (col) =>
{
Label1.Text = "Your text";
//Do something with color
Label1.BackColor = col;
});
//example 2
Object.Add(() =>
{
return someBool ? SomeState.State1 : SomeState.State2;
},
(col) =>
{
Label1.Text = "Your text";
//Do something with color
Label1.BackColor = col;
});
}
public static class Object
{
public static void Add(Func<SomeState> func, Action<Color> action)
{
switch(func())
{
case SomeState.State1:
action(Color.Blue);
break;
case SomeState.State2:
action(Color.Green);
break;
default:
action(Color.Black);
break;
}
}
}
public enum SomeState
{
State1,
State2
}