如何使用循环调用具有不同参数数量的函数
本文关键字:数数 参数 函数 循环 何使用 调用 | 更新日期: 2023-09-27 18:36:05
函数
WriteStartAttribute 可以用 1、2 或 3 个字符串作为参数来调用。我想调用它的数量取决于 writeMap 中的参数数量。为了澄清,我想使用循环执行以下操作:
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);
但是,由于没有重载接受数组(或列表),因此这不起作用。
如何使用循环调用具有不同参数数量的函数?
假设这是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);
您可能正在寻找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]);
嗯,使用反射:
MethodInfo mi = writer.GetType().GetMethod(WriteStartAttribute);
mi.Invoke(instance, argumentList);
调用函数接受要传递给函数的参数数组。这似乎是您所期望的。
我不太喜欢使用反射,因为有可能手动(更长)的方式来这样做。