我想随机选择单击之前创建的一种方法
如果我不能确切地说出我想说的话,对不起我的英语不好
在此处输入代码
public void s1()
{
textBox1.Text = "ali9090";
textBox2.Text = "bar123";
}
public void s2()
{
textBox1.Text = "ali777";
textBox2.Text = "BKardak123";
}
private void button4_Click(object sender, EventArgs e)
{
Random rastgele = new Random();
rastgele.Next(s1(),s2());
}
我知道我的代码很荒谬,但是如果您告诉我如何做我想做的事情,我将不胜感激。
答案 0 :(得分:2)
您可以将方法放入Action
对象的集合中。像这样:
var methods = new List<Action> { () => s1(), () => s2() };
只要您的方法具有相同的签名即可。 (如果没有,则可以将它们包装在具有此功能的Action<>
或Func<>
对象中,但是更大的问题是如何计划动态使用具有不同签名的方法。因此,现在我假设他们是一样的。)
然后,您可以像其他列表一样从该列表中随机选择一个元素,然后像方法一样调用它:
var rastgele = new Random();
var next = rastgele.Next(methods.Count);
methods[next]();
顺便说一句(在下面的评论中建议),您可能想要保留相同的Random
实例,以便随着时间的流逝获得更好的随机性。也许将其放在班级上。像这样:
private Random rastgele = new Random();
private void button4_Click(object sender, EventArgs e)
{
var methods = new List<Action> { () => s1(), () => s2() };
var next = rastgele.Next(methods.Count);
methods[next]();
}
单击之间的时间间隔可能会使随机性看起来很好,并且对于足够小的样本集,它可能永远不会成为问题。但是最好养成保持单个随机化器的习惯,因为当多个随机化器与同一种子一起快速连续使用时,它可能会成为错误的来源。
答案 1 :(得分:1)
上面的答案很好,但是如果您想以简单的方式实现,则可以使用如下所示的switch case(或if / else)。
private void button4_Click(object sender, EventArgs e)
{
Random rastgele = new Random();
int randomNum = rastgele.Next(1,3);
switch (randomNum)
{
case 1:
s1(); break;
case 2:
s2(); break;
}
}
答案 2 :(得分:0)
以下是使用属性的解决方案,可对方法列表进行即时的自动管理:
using System.Reflection;
public partial class FormTest : Form
{
private List<MethodInfo> RandomMethods = new List<MethodInfo>();
private Random Random = new Random();
public FormTest()
{
InitializeComponent();
InitializeRandomMethods();
}
private void InitializeRandomMethods()
{
foreach ( var method in this.GetType().GetMethods() )
foreach ( var attribute in method.GetCustomAttributes(false) )
if ( attribute is RandomMethodAttribute )
if ( method.ReturnType != typeof(void) || method.GetParameters().Length != 0 )
{
string strError = $"Bad method signature: {GetType().Name}.{method.Name}"
+ Environment.NewLine
+ "Must have no return type and no parameters.";
MessageBox.Show(strError, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
RandomMethods.Add(method);
}
[RandomMethod]
public void s1()
{
textBox1.Text = "ali9090";
textBox2.Text = "bar123";
}
[RandomMethod]
public void s2()
{
textBox1.Text = "ali777";
textBox2.Text = "BKardak123";
}
private void button4_Click(object sender, EventArgs e)
{
if (RandomMethods.Count > 0)
RandomMethods[Random.Next(RandomMethods.Count)].Invoke(this, null);
else
{
string strWarning = "No random method available.";
MessageBox.Show(strWarning, Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
在表单类代码之后或在另一个文件中:
public class RandomMethodAttribute : Attribute
{
public RandomMethodAttribute()
{
}
}