如何使用循环调用具有不同参数的函数?

时间:2012-06-03 13:20:56

标签: c# function loops arguments

可以使用1,2或3个字符串作为参数调用函数WriteStartAttribute。我想要调用它的数量取决于writeInfo中的参数数量。为了澄清,我想使用循环执行以下操作:

if (writeInfo.Count == 2)
{
    writer.WriteStartAttribute(writeInfo[1]);
}
else if (writeInfo.Count == 3)
{
    writer.WriteStartAttribute(writeInfo[1], writeInfo[2]);
}
else if (writeInfo.Count == 4)
{
    writer.WriteStartAttribute(writeInfo[1], writeInfo[2], writeInfo[4]);
}

我尝试使用这样的数组(和List):

for (int i = 0; writeInfo.Count() - 1 < i; i += 1)
{
     argumentList[i] = writeInfo[i + 1];
}
writer.WriteStartAttribute(argumentList);

但是,因为没有重载接受数组(或List),所以这不起作用。
如何使用循环调用具有不同参数的函数?

3 个答案:

答案 0 :(得分:3)

假设这是XmlTextWriter.WriteStartAttribute,它不接受params,因此您必须手动处理它。

创建自己的params方法,然后将if语句放在那里:

void WriteStartAttribute(params string[] values) 
{
     if (values.Length > 4 || values.Length < 2) throw new ArgumentException();
     if (values.Count == 2)
     {
        writer.WriteStartAttribute(values[1]);
     }
     else if (values.Count == 3)
     {
        writer.WriteStartAttribute(values[1], values[2]);
     }
     else if (writeInfo.Count == 4)
     {
        writer.WriteStartAttribute(values[1], values[2], values[4]);
     }
  }

然后在循环中调用它:

WriteStartAttributes(writeInfo);

使其成为扩展方法的奖励积分:

public static void WriteStartAttribute(this XmlTextWriter writer, params string[] values) 
...

writer.WriteStartAttributes(writeInfo);

答案 1 :(得分:2)

您可能正在寻找params keyword

  

params关键字允许您指定采用a的方法参数   可变数量的参数。

     

您可以发送以逗号分隔的指定类型的参数列表   在参数声明中,或者参数的数组   指定的类型。你也可以不发送任何参数。

public void WriteStartAttribute(params string[] list)
{
    for (int i = 0; i < list.Length; i++)
    {
        Console.Write(list[i] + " ");
    }
    Console.WriteLine();
}

// this works:
writer.WriteStartAttribute(writeInfo[1], writeInfo[2], writeInfo[4]);

答案 2 :(得分:0)

嗯,用反射:

MethodInfo mi = writer.GetType().GetMethod(WriteStartAttribute);
mi.Invoke(instance, argumentList);

invoke函数将一个参数数组传递给函数。这似乎是你所期待的。

我不喜欢使用反射,因为有可能手动(更长)的方式。