0

可以使用 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]);
}

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

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

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

4

3 回答 3

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);
于 2012-06-03T13:28:28.697 回答
2

您可能正在寻找params keyword.

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

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

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]);
于 2012-06-03T13:23:25.377 回答
0

嗯,使用反射:

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

调用函数接受要传递给函数的参数数组。这似乎是您所期望的。

我不喜欢在可能的手动(更长)方式的情况下使用反射。

于 2012-06-03T13:31:05.603 回答