Cum pot crea metode de prototip (cum ar fi JavaScript) în C # .Net?

Cum este posibil să se facă metode prototip în C# .Net?

În JavaScript, pot face următoarele pentru a crea o metodă trim pentru obiectul șir:

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

Cum pot să fac asta în C# .Net?

0
fr hi bn

4 răspunsuri

Folosind compilatorul 3.5 puteți utiliza o metodă de extindere:

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

Puteți utiliza acest lucru pe un proiect CLR 2.0 vizat (3.5 compilator) prin includerea acestui hack:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
0
adăugat

Nu puteți adăuga dinamic metode la obiecte sau clase existente în .NET, cu excepția schimbării sursei pentru acea clasă.

Cu toate acestea, puteți utiliza în C# 3.0 metode de extensie, care văd ca metode noi, dar sunt magie de compilare.

Pentru a face acest lucru pentru codul dvs.:

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

Pentru ao folosi:

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

Aceasta arata ca o noua metoda, dar va compila exact acelasi mod ca si acest cod:

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

Ce anume încercați să realizați? Poate că există modalități mai bune de a face ceea ce doriți?

0
adăugat
Vă mulțumim Lassevk, răspuns excelent :) Ca răspuns la "Ce anume încercați să realizați?". Din când în când, am nevoie să manipulez un șir sau alt obiect. În loc să trebuiască să chem o funcție în acest sens, m-aș fi gândit mai bine să o numesc o metodă. În prezent scriu aplicații web în Asp.net și nu cred că există Asp.net 3.x încă, așa că va trebui să aștept acum. Dar multumesc pentru raspunsul tau.
adăugat autor GateKiller, sursa

Se pare că vorbești despre metodele de extindere ale C #. Adăugați funcționalitate la clasele existente introducând cuvântul cheie "acest" înainte de primul parametru. Metoda trebuie să fie o metodă statică într-o clasă statică. String-urile din .NET au deja o metodă "Trim", așa că voi folosi un alt exemplu.

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

Deci, acum fiecare șir are o metodă extrem de utilă pentru ContainsMabster, pe care o pot folosi în felul următor:

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

Rețineți că puteți adăuga, de asemenea, metode de extensie la interfețe (de exemplu, IList), ceea ce înseamnă că orice clasă care implementează acea interfață va prelua de asemenea noua metodă.

Orice parametri suplimentari pe care îi declarați în metoda extensiei (după primul parametru "this") sunt tratate ca parametri normali.

0
adăugat

Trebuie să creați o metodă de extensie, care necesită .NET 3.5. Metoda trebuie să fie statică, într-o clasă statică. Primul parametru al metodei trebuie să fie prefixat cu "acest" în semnătură.

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

Apoi, puteți să-l sunați

"asdfas".MyMethod();
0
adăugat