Domanda

Come è possibile creare metodi prototipo in C#.Net?

In JavaScript, posso fare quanto segue per creare un metodo trim per l'oggetto stringa:

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

Come posso farlo in C#.Net?

È stato utile?

Soluzione

Non è possibile aggiungere dinamicamente metodi a oggetti o classi esistenti in .NET, se non modificando l'origine per quella classe.

È tuttavia possibile, in C# 3.0, utilizzare i metodi di estensione which Aspetto come nuovi metodi, ma sono magia in fase di compilazione.

Per fare questo per il tuo codice:

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

Per usarlo:

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

Sembra un nuovo metodo, ma verrà compilato esattamente nello stesso modo di questo codice:

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

Cosa stai cercando di realizzare esattamente?Forse ci sono modi migliori per fare quello che vuoi?

Altri suggerimenti

Sembra che tu stia parlando dei metodi di estensione di C#.Aggiungi funzionalità alle classi esistenti inserendo la parola chiave "this" prima del primo parametro.Il metodo deve essere un metodo statico in una classe statica.Le stringhe in .NET hanno già un metodo "Trim", quindi utilizzerò un altro esempio.

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

Quindi ora ogni stringa ha un metodo ContieneMabster estremamente utile, che posso usare in questo modo:

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

Tieni presente che puoi anche aggiungere metodi di estensione alle interfacce (ad esempio IList), il che significa che qualsiasi classe che implementa quell'interfaccia utilizzerà anche quel nuovo metodo.

Eventuali parametri aggiuntivi dichiarati nel metodo di estensione (dopo il primo parametro "this") vengono trattati come parametri normali.

È necessario creare un metodo di estensione che richiede .NET 3.5.Il metodo deve essere statico, in una classe statica.Il primo parametro del metodo deve avere il prefisso "this" nella firma.

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

Puoi quindi chiamarlo così

"asdfas".MyMethod();

Usando il compilatore 3.5 puoi usare un metodo di estensione:

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

Puoi usarlo su un progetto mirato a CLR 2.0 (compilatore 3.5) includendo questo hack:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top