0

関数WriteStartAttributeは、引数として1、2、または3つの文字列を使用して呼び出すことができます。呼び出したい量は、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);

invoke関数は、関数に渡される引数の配列を取ります。これはあなたが期待していることのようです。

私は、手動で(より長い)方法が可能な場合にリフレクションを使用することはあまり好きではありません。

于 2012-06-03T13:31:05.603 に答える