Pregunta

Con suerte, esto debería ser sencillo.

Me gustaría agregar un método de extensión a la clase System.Web.Mvc.ViewPage< T >.

¿Cómo debería verse este método de extensión?

Mi primer pensamiento intuitivo es algo como esto:

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

Solución

La solución general es esta respuesta.

La solución específica para ampliar la clase System.Web.Mvc.ViewPage es mi respuesta a continuación, que comenzó desde el solución general.

La diferencia es que, en el caso específico, necesita una declaración de método de tipo genérico Y una declaración para imponer el tipo genérico como tipo de referencia.

¿Fue útil?

Solución

No tengo VS instalado en mi máquina actual, pero creo que la sintaxis sería:

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

Otros consejos

Gracias leddt.Hacer eso produjo el error:

El tipo 'tmodel' debe ser un tipo de referencia para usarlo como parámetro 'tmodel' en el tipo o método genérico

que me señaló esta página, que arrojó esta solución:

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

Sólo necesita el especificador de tipo genérico en la función:

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

Editar:¡Me lo perdí por unos segundos!

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

Es posible que también necesite/desee agregar el calificador "new()" al tipo genérico (es decir,"donde T :class, new()" para hacer cumplir que T es un tipo de referencia (clase) y tiene un constructor sin parámetros.

Glenn bloque tiene un buen ejemplo de implementación de ForEach método de extensión para IEnumerable<T>.

De su entrada en el 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 desea que la extensión solo esté disponible para el tipo especificado, simplemente necesita especificar el tipo real que manejará

algo como...

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

Tenga en cuenta que Intellisense solo mostrará el método de extensión cuando declare su ViewPage (en este caso) con el tipo coincidente.

Además, es mejor no utilizar el espacio de nombres System.Web.Mvc. Sé que es conveniente no tener que incluir su espacio de nombres en la sección de usos, pero es mucho más fácil de mantener si crea su propio espacio de nombres de extensiones para sus funciones de extensión.

A continuación se muestra un ejemplo de vistas de 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();
    }
}

Realmente no necesitas usar la versión genérica ya que la genérica extiende la no genérica, así que colócala en la clase base no genérica y listo :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top