Frage

Dies sollte hoffentlich ein einfacher sein.

Ich möchte eine Verlängerung Methode zum System.Web.Mvc.ViewPage Klasse hinzuzufügen.

Wie soll diese Erweiterung Methode aussehen?

Meine erste intuitive Gedanke ist so etwas wie folgt aus:

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

Lösung

Die allgemeine Lösung ist diese Antwort .

Die spezifische Lösung, die die System.Web.Mvc.ViewPage Klasse erstreckt, ist meine Antwort unten, die von der allgemeine Lösung .

Der Unterschied ist im speziellen Fall, dass Sie sowohl eine generisch typisierten Verfahren Erklärung und eine Erklärung benötigen den generischen Typen als Referenztyp zu erzwingen.

War es hilfreich?

Lösung

Ich habe nicht VS auf meinem aktuellen Rechner installiert, aber ich denke, die Syntax wäre:

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

Andere Tipps

Danke leddt. Dadurch, dass der Fehler ergab:

  

Der Typ ‚TModel‘ muss eine Referenz sein   Typ, um es als Parameter zu verwenden,   'TModel' in dem generischen Typ oder Methode

was mich deutete auf diese Seite , die diese Lösung ergab:

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

Es muss nur die generischen Typspezifizierer auf der Funktion:

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

Edit: Gerade verpasst es von Sekunden

namespace System.Web.Mvc
{
    public static class ViewPageExtensions
    {
        public static string GetDefaultPageTitle<T>(this ViewPage<T> view)
            where T : class
        {
            return "";
        }
    }
}

Sie müssen unter Umständen auch / wollen den „new ()“ Qualifier gattungs hinzuzufügen (zB „where T: Klasse, neu ()“ zu erzwingen, dass T ist sowohl ein Referenz-Typ (Klasse) und einen parameter hat Konstruktor.

Glenn Block- ein gutes Beispiel hat eine ForEach Erweiterung Methode zur Durchführung auf IEnumerable<T>.

Von seinem Blog-Post :

public static class IEnumerableUtils
{
    public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
    {
        foreach(T item in collection)
            action(item);
    }
}

Wenn Sie wollen, dass die Verlängerung nur für den angegebenen Typen verfügbar sein Sie einfach nur den tatsächlichen Typ angeben müssen Sie werden Umgang mit

so etwas wie ...

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

Hinweis Intellisense wird dann nur die Erweiterungsmethode anzuzeigen, wenn Sie Ihre (in diesem Fall) View mit dem passenden Typ deklarieren.

Auch am besten nicht den System.Web.Mvc Namespace zu verwenden, ich weiß, sie bequem zu nicht Ihren Namensraum im usings Abschnitt enthalten müssen, aber sein weit besser verwaltbar, wenn Sie Ihre eigenen Erweiterungen Namespace für Ihre Erweiterungsfunktionen erstellen.

Hier ist ein Beispiel für Razor Ansichten:

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();
    }
}

Sie wirklich brauchen nicht die generische Version als generische verwenden erstreckt sich die nicht-generischen so legt es nur in der nicht-generischen Basisklasse und fertig:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top