1
 List<DynamicBusinessObject> dbo = SearchController.Instance.GetSearchResultList(search, null, "date", startRow - 1, ucDataPager1.PageSize, state);

上記のコード行は、これまで 5 つの引数を持っていた GetSearchResultList メソッドを呼び出しています。

6 番目の引数を追加しましたが、この関数を呼び出す他のすべてのページをまだ更新する必要がないように、この引数をオプションにしたかったのです。

そこで、関数を次のように変更しました。

        [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
    public List<DynamicBusinessObject> GetSearchResultList(Search search, List<CategoryAttribute> listCatAttrib, string sortBy, int startRow, int pageSize, [Optional, DefaultParameterValue("")] string state)
    {
        StorageQuery qry = new QrySearchResult(
            search.ID,
            (listCatAttrib != null && listCatAttrib.Count > 0) ? listCatAttrib[0].Attribute.ID : -1,
            (listCatAttrib != null && listCatAttrib.Count > 1) ? listCatAttrib[1].Attribute.ID : -1,
            (listCatAttrib != null && listCatAttrib.Count > 2) ? listCatAttrib[2].Attribute.ID : -1,
            1, sortBy, startRow, pageSize, state);
        List<DynamicBusinessObject> list = BusinessObject.Search(qry);
        return list;
    }

ただし、ビルドしようとすると、GetSearchResultList にオーバーロード メソッドがなく、5 つの引数を取るというエラーが表示されます。[Optional] を使用する代わりに、 string state = "" も試しました

6番目の引数がオプションである場合、呼び出しを行うときに6つの引数を渡さないことに不平を言う理由を誰かが知っていますか?

4

2 に答える 2

2

これらの属性は、C# でオプションのパラメーターを定義する方法ではありません。

むしろ、構文は単にパラメーターと= <value>です。

したがって、メソッドの署名は次のようになります。

public List<DynamicBusinessObject> GetSearchResultList(
    Search search, 
    List<CategoryAttribute> listCatAttrib, 
    string sortBy, 
    int startRow, 
    int pageSize,
    string state = "")

空の文字列の代わりに null を使用することをお勧めしますが、これらの署名が外部ライブラリによって使用される場合は、既定の型がより自然に適合します。

オプションのパラメーターは定数のようなもので、コンパイル時に参照アセンブリに組み込まれます。

次のように、オプションのパラメーターを使用してこのメ​​ソッドを呼び出す別のライブラリがあるとします。

myObj.GetSearchListResult(search, listCatAttrib, sortBy, startRow, pageSize);

このライブラリをコンパイルすると、呼び出しは実際には次のようにライブラリに書き込まれます。

myObj.GetSearchListResult(search, listCatAttrib, sortBy, startRow, pageSize, "");

次に、メソッドの宣言を次のように変更すると:

public List<DynamicBusinessObject> GetSearchResultList(
    Search search, 
    List<CategoryAttribute> listCatAttrib, 
    string sortBy, 
    int startRow, 
    int pageSize,
    string state = "some value")

最初のライブラリでの呼び出しは、新しい値ではなく空の文字列を渡しますメソッドのすべての呼び出し元を再コンパイルして、新しい値が確実に取得されるようにする必要があります。

とはいえ、これが、このメソッドをアセンブリの外部で公開する場合、既定値の代わりにオーバーロードを使用する理由です。オーバーロードでメソッドに渡される値を変更する場合は、メソッドが定義されているアセンブリを配布するだけで済みます。配布して、そのメソッドに対するすべての呼び出し元を再コンパイルする必要はありません。

于 2012-10-18T01:26:01.820 に答える
1

以下を使用できるはずです。

..., string state = "") {

考えられる問題の 1 つは、プロジェクトが古いバージョンの .NET をターゲットにしていることです。プロジェクトのプロパティをチェックして、正しいバージョンを指していることを確認してください。

于 2012-10-18T01:23:28.877 に答える