C# 如何循环所有函数?

C# 如何循环所有函数?,c#,.net,for-loop,C#,.net,For Loop,我正在做一个项目,我被卡住了:(……我有9(九)个函数,名字是: getM1()、getM2()、getM3()、getM4()……getM5()。所有这些函数都返回一个值 现在我需要做一个循环来检查这些函数的值。如下所示: public void show() { for (int i = 1; i <= 9; i++) { if (obj.getM[i]() == 1) { .......; }

我正在做一个项目,我被卡住了:(……我有9(九)个函数,名字是: getM1()、getM2()、getM3()、getM4()……getM5()。所有这些函数都返回一个值

现在我需要做一个循环来检查这些函数的值。如下所示:

public void show()
{
    for (int i = 1; i <= 9; i++)
    {
        if (obj.getM[i]() == 1)
        {
          .......;
        }
    }
}
public void show()
{
对于(int i=1;i
public void Show()
{
Func[]arr=new[]
{
obj.GetM1,
obj.GetM2,
...
};
foreach(arr中的Func Func)
{
如果(func()==1)
{
//
}
}
}

创建一个
Func
委托数组,并使用它访问您的方法:

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)
    {
        ;
    }
}
var函数=新函数[9];
函数[0]=getM1;
函数[1]=getM2;
函数[2]=getM3;
// (...)

对于(int i=0;i如何将函数放入数组中:

var functionList = new [] { obj.getM1, obj.getM2, ... };
然后在它上面循环

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

将这些方法替换为:

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);
}
var t=obj.GetType();

对于(int i=1;i创建一个
Func
数组,其中
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)
    {
      .......;
    }
}
Func[]ems=new Func[]{
()=>obj.getM1(),()=>obj.getM2(),()=>obj.getM3()
,()=>obj.getM4(),()=>obj.getM5(),()=>obj.getM6()
,()=>obj.getM7(),()=>obj.getM8(),()=>obj.getM9()
};
foreach(在ems中的功能)
{
如果(em()==1)
{
.......;
}
}

您可以将所有这些方法存储在一个列表中,在列表上循环并执行它们

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

这些函数的签名是什么?它们是
int-getM1()
int-getM2()
,等等吗?您需要的不是9个函数,而是一个。是的,它们都是int-getM1()..最好使用集合初始值设定项来初始化数组。为什么您认为这样更好?我认为更快更可靠。@abatishchev我认为它编译成相同的东西,所以速度应该不会受到影响。不过,集合初始值设定项意味着更干净、可读性更强的代码,这比这里的其他考虑因素更重要,并且d也是我的首选。最好使用集合初始值设定项初始化列表。也可以使用数组。您可以用
obj.getM1
替换
()=>obj.getM1()
var funcList = new List<Func<int>>{ getM1, getM2, ... };
foreach(var func in funList)
{
    if(func() == 1)
        ...
}