Domanda

Questo dovrebbe essere semplice.

Vorrei aggiungere un metodo di estensione per il Sistema.Web.Mvc.ViewPage< T > class.

Come metodo di estensione look?

Il mio primo pensiero intuitivo è qualcosa di simile a questo:

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

Soluzione

La soluzione generale è questa risposta.

La soluzione specifica per l'estensione del Sistema.Web.Mvc.ViewPage classe è la mia risposta di seguito, iniziato al soluzione generale.

La differenza è che nel caso specifico è necessario che sia una genericamente digitato nella dichiarazione di un metodo E di una dichiarazione per far valere il tipo generico, come un tipo di riferimento.

È stato utile?

Soluzione

Non ho VS installato sulla mia macchina attuale, ma credo che la sintassi dovrebbe essere:

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

Altri suggerimenti

Grazie leddt.Facendo che ha dato l'errore:

Il tipo 'TModel' deve essere un riferimento tipo, al fine di utilizzarlo come parametro 'TModel' il tipo generico o metodo

che mi ha indicato questa pagina, che ha reso questa soluzione:

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

Necessita solo di un generico tipo di identificatore della funzione:

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

Edit:Ci è mancato per una manciata di secondi!

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

Si può anche bisogno/desiderio di aggiungere il "new()" qualificatore di tipo generico (es."dove T :classe (nuovo)" ai fini dell'applicazione che T è un tipo di riferimento (classe) e un costruttore senza parametri.

Glenn Blocco è un buon esempio di implementazione di un ForEach metodo di estensione per IEnumerable<T>.

Dal suo post del blog:

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

Se si desidera che l'estensione ad essere disponibile solo per il tipo specificato hai semplicemente bisogno di specificare il tipo da essere la gestione di

qualcosa di simile...

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

Nota intellisense sarà quindi visualizzare solo il metodo di estensione quando si dichiara (in questo caso) ViewPage con il tipo di corrispondenza.

Inoltre, meglio non utilizzare il Sistema.Web.Mvc spazio dei nomi, so che è conveniente non è necessario includere il vostro spazio dei nomi in inutilizzate sezione, ma la sua molto più gestibile se si crea la propria estensione dello spazio dei nomi per le funzioni di estensione.

Ecco un esempio per il Rasoio di vista:

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

Davvero non c'è bisogno di utilizzare la versione Generica come generic si estende non generica e quindi basta metterlo nel non generica classe di base e il gioco è fatto :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top