【问题标题】:How to loop all functions?如何循环所有功能?
【发布时间】:2013-04-09 17:42:27
【问题描述】:

我正在做一个项目,但我遇到了困难:(....我有 9(九)个函数,名称为: 获取M1(),获取M2(),获取M3(),获取M4()....获取M5()。所有这些函数都返回一个值。

现在我需要创建一个循环来检查这些函数的值。像这样的:

public void show()
{
    for (int i = 1; i <= 9; i++)
    {
        if (obj.getM[i]() == 1)
        {
          .......;
        }
    }
}

当然它会显示一个错误,因为 getM 不包含任何索引.. 我想问你,你能帮我解决这个问题吗?或者有人知道如何检查所有 getM() 函数吗?

【问题讨论】:

  • 这些函数的签名是什么?他们是int getM1()int getM2()等吗?
  • 你需要一个Array,而不是9个函数。
  • 是的,它们都是 int getM1()....

标签: c# .net for-loop


【解决方案1】:

创建一个Func&lt;int&gt; 代表数组并使用它来访问您的方法:

var functions = new Func<int>[9];
functions[0] = getM1;
functions[1] = getM2;
functions[2] = getM3;
// (...)

for (int i = 0; i <= 9; i++)
{
    if (functions[i]() == 1)
    {
        ;
    }
}

【讨论】:

  • 最好使用集合初始化器来初始化数组。
  • 为什么你认为它更好?
  • 在我看来更快更可靠。
  • @abatishchev 我认为它编译成同样的东西,所以速度不应该受到影响。尽管如此,集合初始值设定项意味着 IMO 代码更清晰、更易读,这比这里的其他考虑更重要,也将使其成为我的首选。
【解决方案2】:

如何将函数放入数组中:

var functionList = new [] { obj.getM1, obj.getM2, ... };

然后循环播放

foreach (var f in functionList)
{
    if (f() == 1) 
    ...
}

【讨论】:

    【解决方案3】:

    用这个替换方法:

    int getM(int index)
    

    如果这个和其他建议的解决方案真的没有任何意义,你可以使用反射做你想做的事:

    var t = obj.GetType();
    for (int i = 1; i <= 9; i++)
    {
        var m = t.GetMethod("getM" + i);
        int result = (int)m.Invoke(obj, null);
    }
    

    【讨论】:

      【解决方案4】:

      创建一个Func&lt;T&gt; 数组,其中T 是函数的返回类型。然后,您将能够或多或少地按照您在代码中描述的方式调用您的函数。

      例如,如果你的函数返回int,你可以这样做:

      Func<int>[] ems = new Func<int>[] {
          () => obj.getM1(), () => obj.getM2(), () => obj.getM3()
      ,   () => obj.getM4(), () => obj.getM5(), () => obj.getM6()
      ,   () => obj.getM7(), () => obj.getM8(), () => obj.getM9()
      };
      foreach (Func<int> em in ems)
      {
          if (em() == 1)
          {
            .......;
          }
      }
      

      【讨论】:

      • 您可以将() =&gt; obj.getM1() 替换为obj.getM1
      【解决方案5】:
      public void Show()
      {
         Func<int>[] arr = new[]
         {
             obj.GetM1,
             obj.GetM2,
             ...
         };
         foreach(Func<int> func in arr)
         {
             if (func() == 1)
             {
                 //
             }
         }
      }
      

      【讨论】:

        【解决方案6】:

        您可以将所有这些方法存储在一个列表中,遍历该列表并执行它们。

        var funcList = new List<Func<int>>{ getM1, getM2, ... };
        

        然后你可以遍历列表并执行每个方法。

        foreach(var func in funList)
        {
            if(func() == 1)
                ...
        }
        

        【讨论】:

        • 最好使用集合初始化器来初始化列表。也可以使用数组。
        猜你喜欢
        • 2020-06-01
        • 1970-01-01
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 2015-03-18
        • 2015-05-23
        • 2012-09-15
        • 1970-01-01
        相关资源
        最近更新 更多