Question

Cela devrait être simple, espérons-le.

Je voudrais ajouter une méthode d'extension à System.Web.Mvc.ViewPage < T & Gt; classe.

À quoi cette méthode d'extension devrait-elle ressembler?

Ma première pensée intuitive ressemble à ceci:

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

Solution

La solution générale est cette réponse .

La solution spécifique pour étendre la classe System.Web.Mvc.ViewPage est ma réponse ci-dessous, qui partait de solution générale .

La différence réside dans le cas spécifique où vous avez besoin à la fois d'une déclaration de méthode générique ET d'une instruction pour appliquer le type générique en tant que type de référence.

Était-ce utile?

La solution

Je n'ai pas de VS installé sur ma machine actuelle, mais je pense que la syntaxe serait la suivante:

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

Autres conseils

Merci beaucoup. Faire cela a généré l'erreur:

  

Le type 'TModel' doit être une référence   tapez afin de l'utiliser comme paramètre   'TModel' dans le type générique ou la méthode

qui m'a dirigé sur cette page , qui a généré cette solution:

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

Il suffit de spécifier le spécificateur de type générique pour la fonction:

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

Edit: ça vient de le manquer de quelques secondes!

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

Vous pouvez également avoir besoin de / souhaiter ajouter le " new () " qualificateur au type générique (c'est-à-dire & "; où T: classe, new () &"; pour imposer que T soit à la fois un type référence (classe) et possède un constructeur sans paramètre.

Glenn Block offre un bon exemple d'implémentation d'une méthode d'extension ForEach sur IEnumerable<T>.

De son article de blog :

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

Si vous souhaitez que l'extension ne soit disponible que pour le type spécifié il vous suffit simplement de spécifier le type réel que vous allez manipuler

quelque chose comme ...

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

Remarque intellisense n’affiche alors la méthode d’extension que lorsque vous déclarez votre (dans ce cas) ViewPage avec le type correspondant.

De même, il est préférable de ne pas utiliser l'espace de noms System.Web.Mvc. Je sais qu'il est pratique de ne pas inclure votre espace de noms dans la section usings, mais qu'il est beaucoup plus facile à gérer si vous créez votre propre espace de noms d'extensions pour vos fonctions d'extension.

Voici un exemple pour les vues 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();
    }
}

Vous n'avez vraiment pas besoin d'utiliser la version générique car la version générique étend la version non générique, insérez-la simplement dans la classe de base non générique et vous avez terminé:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top