11

これは単純なものであることを願っています。

System.Web.Mvc.ViewPage< T > クラスに拡張メソッドを追加したいと考えています。

この拡張メソッドはどのように見えるべきですか?

私の最初の直感的な考えは次のようなものです。

namespace System.Web.Mvc
{
    public static class ViewPageExtensions
    {
        public static string GetDefaultPageTitle(this ViewPage<Type> v)
        {
            return "";
        }
    }
}

解決

一般的な解決策はthis answerです。

System.Web.Mvc.ViewPage クラスを拡張するための具体的な解決策は、一般的な解決策から始めた以下の私の答えです。

違いは、ジェネリックに型指定されたメソッド宣言と、ジェネリック型を参照型として強制するためのステートメントの両方が必要な特定のケースにあります。

4

7 に答える 7

18

現在のマシンに VS がインストールされていませんが、構文は次のようになると思います。

namespace System.Web.Mvc
{
    public static class ViewPageExtensions
    {
        public static string GetDefaultPageTitle<T>(this ViewPage<T> v)
        {
            return "";
        }
    }
}
于 2008-09-16T02:05:58.580 に答える
6

leddtに感謝します。これを行うとエラーが発生しました:

ジェネリック型またはメソッドでパラメーター「TModel」として使用するには、型「TModel」が参照型である必要があります。

これは私にこのページを示し、この解決策をもたらしました:

namespace System.Web.Mvc
{
    public static class ViewPageExtensions
    {
        public static string GetDefaultPageTitle<T>(this ViewPage<T> v) 
          where T : class
        {
            return "";
        }
    }
}
于 2008-09-16T02:10:13.750 に答える
3

関数にジェネリック型指定子が必要なだけです。

namespace System.Web.Mvc
{
    public static class ViewPageExtensions
    {
        public static string GetDefaultPageTitle<Type>(this ViewPage<Type> v)
        {
            return "";
        }
    }
}

編集:ほんの数秒でそれを逃しました!

于 2008-09-16T02:06:55.940 に答える
2
namespace System.Web.Mvc
{
    public static class ViewPageExtensions
    {
        public static string GetDefaultPageTitle<T>(this ViewPage<T> view)
            where T : class
        {
            return "";
        }
    }
}

また、ジェネリック型に「new()」修飾子を追加する必要がある場合もあります(つまり、「where T:class、new()」を使用して、Tが参照型(クラス)であり、パラメーターなしのコンストラクターを持つようにします。

于 2008-09-16T02:35:50.833 に答える
1

指定されたタイプでのみ拡張機能を使用できるようにする場合は、処理する実際のタイプを指定するだけです。

何かのようなもの...

public static string GetDefaultPageTitle(this ViewPage<YourSpecificType> v)
{
  ...
}

インテリセンスは、(この場合は)ViewPageを一致するタイプで宣言した場合にのみ、拡張メソッドを表示することに注意してください。

また、System.Web.Mvc名前空間を使用しないのが最善です。使用セクションに名前空間を含める必要がないので便利ですが、拡張機能用に独自の拡張名前空間を作成すると、はるかに保守しやすくなります。

于 2008-09-16T02:15:24.737 に答える
1

Razor ビューの例を次に示します。

public static class WebViewPageExtensions
{
    public static string GetFormActionUrl(this WebViewPage view)
    {
        return string.Format("/{0}/{1}/{2}", view.GetController(), view.GetAction(), view.GetId());
    }

    public static string GetController(this WebViewPage view)
    {
        return Get(view, "controller");
    }

    public static string GetAction(this WebViewPage view)
    {
        return Get(view, "action");
    }

    public static string GetId(this WebViewPage view)
    {
        return Get(view, "id");
    }

    private static string Get(WebViewPage view, string key)
    {
        return view.ViewContext.Controller.ValueProvider.GetValue(key).RawValue.ToString();
    }
}

ジェネリック バージョンは非ジェネリック バージョンを拡張するため、ジェネリック バージョンを使用する必要はありません。そのため、非ジェネリック ベース クラスに配置するだけで完了です :)

于 2012-08-02T05:21:07.907 に答える
1

Glenn BlockForEachは、 への拡張メソッドを実装する良い例を持っていIEnumerable<T>ます。

彼のブログ投稿から:

public static class IEnumerableUtils
{
    public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
    {
        foreach(T item in collection)
            action(item);
    }
}
于 2008-09-16T02:22:28.430 に答える