可以使用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),所以这不起作用。
如何使用循环调用具有不同参数的函数?
答案 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函数将一个参数数组传递给函数。这似乎是你所期待的。
我不喜欢使用反射,因为有可能手动(更长)的方式。