Vra

Dit behoort hopelik 'n eenvoudige een wees.

Ek wil graag 'n uitbreiding metode toe te voeg tot die System.Web.Mvc.ViewPage klas.

Hoe moet hierdie uitbreiding metode kyk?

My eerste intuïtiewe denke is iets soos hierdie:

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

Oplossing

Die algemene oplossing is hierdie antwoord .

Die spesifieke oplossing vir die uitbreiding van die System.Web.Mvc.ViewPage klas is my antwoord hieronder, wat begin vanaf die algemene oplossing .

Die verskil is in die spesifieke geval jy beide 'n generies getikte metode verklaring en 'n verklaring aan die generiese tipe as 'n verwysing tipe dwing nodig.

Was dit nuttig?

Oplossing

Ek het nie 'VS geïnstalleer op my huidige masjien, maar ek dink die sintaksis sou wees:

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

Ander wenke

Dankie leddt. Doen wat die fout opgelewer:

  

Die tipe 'TModel' moet 'n verwysing wees   tipe om dit te gebruik as parameter   'TModel' in die generiese tipe of metode

wat my herinner aan hierdie bladsy , wat hierdie oplossing opgelewer:

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

Dit moet net die generiese tipe specific op die funksie:

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

Edit: Net dit gemis het deur sekondes

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

Jy kan ook nodig / wil die "nuwe ()" kwalifiseerder te voeg tot die generiese tipe (dws "waar T: klas, nuwe ()" af te dwing dat T is beide 'n verwysing tipe (klas) en het 'n parameterless constructor.

Glenn Blok het 'n goeie voorbeeld van die implementering van 'n ForEach uitbreiding metode om IEnumerable<T>.

Van sy 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);
    }
}

As jy wil hê dat die uitbreiding na slegs beskikbaar vir die gespesifiseerde tipe wees jy eenvoudig net nodig het om die werklike tipe wat jy sal hanteer spesifiseer

iets soos ...

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

Let IntelliSense sal dan net die uitbreiding metode vertoon wanneer jy jou verklaar (in hierdie geval) ViewPage met die ooreenstemmende tipe.

Ook, beste nie na die System.Web.Mvc naamruimte gebruik, ek weet sy gerieflik om nie jou naamruimte in die afdeling usings, maar sluit sy veel meer onderhou as jy jou eie uitbreidings naamruimte vir jou uitbreiding funksies te skep.

Hier is 'n voorbeeld vir menings 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();
    }
}

Jy het regtig nie nodig om die generiese weergawe gebruik as die generiese een strek die nie-generiese een so net sit dit in die nie-generiese basis klas en jy klaar is:)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top