Vra

Hoe is dit moontlik om prototipe metodes maak in C # NET?

In JavaScript, kan ek doen die volgende om 'n trim metode skep vir die string voorwerp:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}

Hoe kan ek te werk gaan om dit te doen in C # NET?

Was dit nuttig?

Oplossing

Jy kan nie dinamies metodes toe te voeg tot die bestaande voorwerpe of klasse in NET, behalwe deur die verandering van die bron vir daardie klas.

Jy kan egter in C # 3,0, gebruik uitbreiding metodes wat kyk soos nuwe metodes, maar is saam te stel-time magie.

Om dit te doen vir jou kode:

public static class StringExtensions
{
    public static String trim(this String s)
    {
        return s.Trim();
    }
}

Om dit te gebruik:

String s = "  Test  ";
s = s.trim();

Dit lyk soos 'n nuwe metode, maar sal presies dieselfde manier op te stel as hierdie kode:

String s = "  Test  ";
s = StringExtensions.trim(s);

Wat presies probeer jy bereik? Dalk is daar beter maniere om dit te doen wat jy wil hê?

Ander wenke

Dit klink soos jy praat C # 's Uitbreiding metodes. Jy voeg funksie om bestaande klasse deur die invoeging van die "hierdie" navraag voordat die eerste parameter. Die metode het 'n statiese metode in 'n statiese klas wees. Snare in NET het reeds 'n "Sny" metode, so ek sal nog 'n voorbeeld gebruik.

public static class MyStringEtensions
{
    public static bool ContainsMabster(this string s)
    {
        return s.Contains("Mabster");
    }
}

So nou elke string het 'n geweldig nuttig ContainsMabster metode, wat ek kan gebruik soos volg:

if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ }

Let daarop dat jy ook uitbreiding metodes om koppelvlakke (bv IList), wat beteken dat 'n klas te implementeer wat interface ook sal haal kan byvoeg dat nuwe metode.

Enige ekstra parameters jy verklaar in die uitbreiding metode (na die eerste "hierdie" parameter) word beskou as normale parameters.

Jy moet 'n uitbreiding metode, wat NET 3.5 vereis skep. Die metode moet statiese te wees, in 'n statiese klas. Die eerste parameter van die metode moet word voorafgegaan met "hierdie" in die handtekening.

public static string MyMethod(this string input)
{
    // do things
}

Jy kan dan noem dit soos

"asdfas".MyMethod();

Die gebruik van die 3.5 samesteller jy kan gebruik om 'n Uitbreiding Metode:

public static void Trim(this string s)
{
  // implementation
}

Jy kan dit gebruik op 'n CLR 2.0 geteiken projek (3.5 samesteller) deur die insluiting van hierdie hack:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top