Hoe kan jy skryf 'n C # Uitbreiding Metode vir 'n generies Getikte Klas
-
09-06-2019 - |
Vra
Dit behoort hopelik 'n eenvoudige een wees.
Ek wil graag 'n uitbreiding metode toe te voeg tot die System.Web.Mvc.ViewPage
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.
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:)