1

クエリ文字列パラメータなどを使用してURLを作成するクラスがあります。クラスには、クラスプロパティから構成される完全なURLを返すUrl()メソッドと、プロパティの1つの値を置き換えるためのパラメータとして述語を渡すことができるUrlNew()メソッドがあり、変更されたURLを返します。 。ここで、この関数を変更して、両方の述語である2つのパラメーターを使用する必要があります。それ、どうやったら出来るの?メソッドのパラメーターを述語のリストとして変更しようとしましたが、おそらく正しく実行されていません。

私のOLDUrlNew()メソッドは次のようになりました。

public static string Url() (Action<LGUrlBuilder> predicate)
    {
        var instance = new LGUrlBuilder();
        if (predicate != null) predicate(instance);
        return instance.BuildUrl();
    }

私の新しいUrlNew()メソッドは次のようになります。

public static string UrlNew(List<Action<LGUrlBuilder>> predicateList)
    {
        var instance = new LGUrlBuilder();
        if (predicateList != null && predicateList.Count > 0)
        {
            foreach (Action<LGUrlBuilder> predicate in predicateList)
            {
                if (predicate != null) predicate(instance);
            }
        }

        return instance.BuildUrl();
    }

これは問題なくコンパイルされますが、実行すると、ASPXで使用すると次のエラーが発生します。

CS1660: Cannot convert lambda expression to type 'System.Collections.Generic.List<System.Action<public_site.Library.LG.LGUrlBuilder>>' because it is not a delegate type

私はC#の初心者であり、完全に間違ったことをしていると確信しています。どんなアドバイスも役に立ちます。ありがとう!

4

2 に答える 2

5

関数自体を変更しないでください。次のようにメソッド呼び出しを変更します。

UrlNew(x => { func1(x); func2(x); });

ただし、実際に任意の数のデリゲートインスタンスを引数として使用する場合は、次のように変更してみてください。

public static void UrlNew(params Action<LGUrlBuilder>[] list) {
    // ... do what you're already doing in the second snippet ...
}

あなたはそれを次のように呼ぶことができます:

UrlNew(x => firstthing(), x => secondthing(x), thirdthing);

補足:AnAction<T>は述語とは呼ばれません。述語はブール値を返します。

于 2009-10-11T16:58:39.953 に答える
0

Action<T1,T2>2つのパラメーターを受け入れるオーバーロードされたデリゲートを使用するのはどうですか。ブール値の戻り値を期待する述語を代わりに使用する場合は、代わりに使用してFunc<T1,T2,bool>ください。

于 2009-10-11T17:03:21.083 に答える