1

これは非常に簡単に答えられるはずですが、適切に質問する方法すらわからないので、事前にn00b-nessについてお詫び申し上げます。私は運がない検索のためにそれを言い換えるのに苦労しました...

基本的に、いくつかの引数を「スイッチ」(呼び出し元のメソッドによって0または1に設定)およびオプションの文字列として受け取り、それらを使用してアクションの計画を「構築」するメソッドがあります。これは次のようになります。

public static void Foo(int a, int b, int c, optionalString aa, optionalString, bb, optionalString cc)
{
    if (a == 1)
    { Object1 o1 = Thing.Property1[aa]; }
    if (b == 1)
    { Object2 o2 = Thing.Property2[bb]; }
    if (c == 1)
    { Object3 o3 = Thing.Property3[cc]; }

    Bar(optionalo1, optionalo2, optionalo3); // Edit: I explained this part a little wrong, see below.
}

明確にするために編集:Bar()実際に設定されたプロパティでのみ呼び出す必要があるため、null値を渡すことはできません。たとえば、Foo()は、次のように設定されたa、b、およびcで呼び出されます。

Foo(1, 0, 1, string1, string3) //In this instance I only want the first and third properties set. The strings contain the values I want them set to.
{
    if (a == 1)
    { set this property based on string1 }
    if (b == 1)
    { this one would not be set because b was 0 }
    if (c == 1)
    { set this property based on string3 }

    Bar(property1, property3);
    // In this instance, Bar() must be called with only those two arguments, it cannot contain any null values.

編集終了

したがって、の可能なすべての組み合わせに対してネストされたif()ステートメントまたはメソッドのクラップロードを使用せずBar()に、それらすべてが評価されたら、それを呼び出す方法はありますか?技術的には、変数はまだ割り当てられていないため、Bar()無効です。あるいは、このようなことを達成するためのより良い方法はありますか?

これは、SharePointサーバーオブジェクトモデルと対話するコンソールアプリ用であり、違いが生じます。どうもありがとうございました!

4

3 に答える 3

1

Bar次のように、デフォルト値としてnullをメソッドに渡したいだけかもしれません。

public static void Foo(int a, int b, int c, 
    optionalString aa, optionalString, bb, optionalString cc)
{
    Object1 o1 = null;
    Object1 o2 = null;
    Object1 o3 = null;
    if (a == 1)
    { o1 = Thing.Property1[aa]; }
    if (b == 1)
    { o2 = Thing.Property2[bb]; }
    if (c == 1)
    { o3 = Thing.Property3[cc]; }

    Bar(o1, o2, o3);
}
于 2013-01-25T21:56:32.250 に答える
1

必要なのは、コードをデータに変換することです。いくつかの入力パラメーターがあり、それらに対していくつかのアクションを実行する必要があります。

作成できるDictionary<Key, Action>場所として定義された辞書構造を使用します。Key = whatever unique value次に、メソッドで行う必要があるのは、キーを計算し、関連するアクションを実行することだけです。

あなたの例から:

    public static void Foo(int a, int b, int c, optionalString aa, optionalString, bb, optionalString cc)
    {
Dictionary<int, Action> objectMapper = new Dictionary<int, Action>
        {
            { 0, () => Bar() },
            { 1, () => Bar(Thing.Property1[aa]) },
            { 2, () => Bar(Thing.Property2[bb]) },
            { 4, () => Bar(Thing.Property3[cc]) },
            { 3, () => Bar(Thing.Property1[aa], Thing.Property2[bb]) },
            { 5, () => Bar(Thing.Property1[aa], Thing.Property3[cc]) },
            { 6, () => Bar(Thing.Property2[bb], Thing.Property3[cc]) },
            { 7, () => Bar(Thing.Property1[aa], Thing.Property2[bb], Thing.Property3[cc]) },
        };    
        objectMapper[a & b & c]();
    }

私の例では、一意のキーは単純ANDingに3つの入力変数です。ただし、ご覧のとおり、すべての可能性をカバーするのはかなり面倒です。そのため、この方法を正確に行うことはお勧めしませんが、入力パラメーターをより柔軟にするためにBarメソッドを作り直してみてください。

于 2013-01-25T22:19:07.533 に答える
1

バーの署名にもよりますが、そうです。

バーが次のように宣言されている場合

public static void Bar(params string[] values) {
    foreach(var v in values) {
        // use value
    }
}

次に、Fooは配列を作成して送信するだけです。

var list values = new List<string>();

if(a == 1) {
    list.Add(optionalo1);
    // do whatever else
}

if(b == 1) {
    list.Add(optionalo2);
    // do whatever else
}

Bar(values.ToArray());

編集:

また、Fooが次のように宣言されている場合は注意してください

public static void Foo(int a, int b, int c, string aa = null, string bb = null, string cc = null)

そして、あなたはあなたがあなたの例でしたようにそれを呼びます:

Foo(1, 0, 1, string1, string3)

その場合、string1は意図したとおりstring1になりますが、渡されたstring3はstring2になります。その位置のnullをFooに渡す必要があります。そうしないと、値が混同されます。

于 2013-01-25T22:57:13.140 に答える