我想随机选择我之前创建的方法之一

时间:2019-10-27 11:43:54

标签: c#

我想随机选择单击之前创建的一种方法

如果我不能确切地说出我想说的话,对不起我的英语不好

在此处输入代码

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


}

我知道我的代码很荒谬,但是如果您告诉我如何做我想做的事情,我将不胜感激。

3 个答案:

答案 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()
  {
  }
}