DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■32944 / inTopicNo.1)  拡張メソッドの呼び出し方
  
□投稿者/ oni 一般人(1回)-(2015/05/09(Sat) 14:47:27)
  • アイコン環境/言語:[OS:Windows8.1 64bit、言語:VB.NET 2013] 
    分類:[ASP.NET] 

    こんにちわ、oniといいます。お世話になります。

    @ITさんの以下のWebサイトの情報をもとに、ASP.net WebAPIの勉強をしております。
    http://www.atmarkit.co.jp/ait/articles/1311/06/news070_3.html

    この中の「戻り値にHttpResponseMessageを指定する」にある「HttpRequestMessageExtensions」の
    使い方がわからずに困っております。

    「拡張メソッド」は以下を参照して理解できたつもりです。
    https://msdn.microsoft.com/ja-jp/library/bb384936%28v=vs.108%29.aspx

    ただ、この例は自前で拡張メソッドを用意して利用する内容で、
    もともと存在する拡張メソッド「HttpResponseMessageExtensions」にあるメソッドを
    どのように呼び出すのかが理解することができませんでした。

    思いついたのが、以下の内容です。

    (ソース)
    Imports System.Runtime.CompilerServices
    Imports System.Net.Http

    Module Extensions

    <Extension> _
    Public Function CreateResponse(rm As System.Net.Http.HttpRequestMessage, sc As System.Net.HttpStatusCode) As System.Net.Http.HttpResponseMessage
    Return rm.CreateResponse(sc)
    End Function

    End Module

    上記では、循環参照になってしまうのですが、正しい記述方法がわかりません。

    開発環境はVisualBasic2013です。
    基本的なことが理解できていないのかもしれませんが、よろしくお願いいたします。

引用返信 削除キー/
■32945 / inTopicNo.2)  Re[1]: 拡張メソッドの呼び出し方
□投稿者/ Azulean 大御所(447回)-(2015/05/09(Sat) 15:34:03)
  • アイコンNo32944に返信(oniさんの記事)
    > この中の「戻り値にHttpResponseMessageを指定する」にある「HttpRequestMessageExtensions」の
    > 使い方がわからずに困っております。

    何も気にせず、単なるメソッドのように呼べばよいです。


    > ただ、この例は自前で拡張メソッドを用意して利用する内容で、
    > もともと存在する拡張メソッド「HttpResponseMessageExtensions」にあるメソッドを
    > どのように呼び出すのかが理解することができませんでした。


    拡張メソッドは、本来 HttpRequestMessageExtensions.CreateResponse(request, statusCode) と書かないといけない呼び出しを、request.CreateResponse(statusCode) と簡便に書けるようにする仕組みです。
    すでに存在する拡張メソッドを使うだけであれば、対象のオブジェクトのメソッドのように呼べばよいだけです。
    明示的に呼びたい場合は、前述のように クラス名.メソッド名(対象のオブジェクト, 残りの引数) という呼び方もできます。(単なる Shared メソッドとして扱える)

    拡張メソッドを使ってもコンパイルが失敗する場合の多くは、名前空間の参照が足りていないことです。
    Imports で対象のクラスの名前空間を参照していれば問題ありません。

    > 思いついたのが、以下の内容です。
    (略)
    > 上記では、循環参照になってしまうのですが、正しい記述方法がわかりません。

    この部分で掲載されていたソースコードは消してください。
    本来呼びたい HttpRequestMessageExtensions クラスのメソッドを呼びづらくするだけなので。
引用返信 削除キー/
■32946 / inTopicNo.3)  Re[2]: 拡張メソッドの呼び出し方
□投稿者/ oni 一般人(2回)-(2015/05/10(Sun) 18:44:45)
  • アイコンAzuleanさん、こんにちわ。
    ご返信ありがとうございます。

    > 何も気にせず、単なるメソッドのように呼べばよいです。

    request.CreateResponse(statusCode)
    と記述することで、普通に呼ぶことができました。
    インテリセンスが働かないため、呼べないと思っておりました。
    ありがとうございました。

    > 拡張メソッドは、本来 HttpRequestMessageExtensions.CreateResponse(request, statusCode) と書かないといけない呼び出しを、request.CreateResponse(statusCode) と簡便に書けるようにする仕組みです。
    > すでに存在する拡張メソッドを使うだけであれば、対象のオブジェクトのメソッドのように呼べばよいだけです。
    > 明示的に呼びたい場合は、前述のように クラス名.メソッド名(対象のオブジェクト, 残りの引数) という呼び方もできます。(単なる Shared メソッドとして扱える)
    >
    > 拡張メソッドを使ってもコンパイルが失敗する場合の多くは、名前空間の参照が足りていないことです。
    > Imports で対象のクラスの名前空間を参照していれば問題ありません。

    もうひとつ初歩的な質問なのですが、
    Imports System.Net.Http
    を記述しているのですが、
    HttpRequestMessageExtensions.CreateResponse(request, statusCode)
    と記述すると
    「'HttpRequestMessageExtensions' は、名前空間 'System.Net.Http' では不適切です。」
    というエラーになってしまいます。

    まだ、名前空間の参照が足りないのでしょうか。
    何度もお手数ですが、ご教授ください。


引用返信 削除キー/
■32947 / inTopicNo.4)  Re[3]: 拡張メソッドの呼び出し方
□投稿者/ Azulean 大御所(448回)-(2015/05/10(Sun) 20:38:58)
  • アイコン2015/05/10(Sun) 20:39:21 編集(投稿者)

    No32946に返信(oniさんの記事)
    > 「'HttpRequestMessageExtensions' は、名前空間 'System.Net.Http' では不適切です。」
    > というエラーになってしまいます。

    '<name>' は、名前空間 '<namespacename>' では不適切です。
    https://msdn.microsoft.com/ja-jp/library/8f0k13d2.aspx

    > あいまいな名前を指定したため、ほかの名前と競合しています。
    > Visual Basic のコンパイラには競合を解決するための規則がないため、あいまいでない名前に変更する必要があります。


    たぶん、参照できる範囲に同じ名前の型があるか、同じ名前のプロパティがあるかなどの理由で HttpRequestMessageExtensions を一意に特定できないのかもしれません。

    手元の Windows Forms の実験環境では再現しないこと、VB.NET は主言語ではないこと、ASP.NET のなじみがないことから、具体的なアドバイスはできかねます。。。
引用返信 削除キー/
■32949 / inTopicNo.5)  Re[4]: 拡張メソッドの呼び出し方
□投稿者/ oni 一般人(3回)-(2015/05/11(Mon) 13:08:14)
  • アイコンNo32947に返信(Azuleanさんの記事)
    > 2015/05/10(Sun) 20:39:21 編集(投稿者)

    Azuleanさん、ありがとうございます。

    > たぶん、参照できる範囲に同じ名前の型があるか、同じ名前のプロパティがあるかなどの理由で HttpRequestMessageExtensions を一意に特定できないのかもしれません。
    >
    > 手元の Windows Forms の実験環境では再現しないこと、VB.NET は主言語ではないこと、ASP.NET のなじみがないことから、具体的なアドバイスはできかねます。。。

    Windowsフォームアプリケーションでは、確かに再現しないですね。
    WebApiプロジェクト作成時に自動生成される何かとおそらく競合しているのかもしれませんが、それ以上はわかりませんでした。
    request.CreateResponse(statusCode)でエラーとならないため、解決とさせていただきます。
    ありがとうございました。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -