Jak mohu vytvořit prototypy metody (jako JavaScript) v C # .NET?

hlasů
15

Jak je to možné, aby se metody prototyp v C # .NET?

V jazyce JavaScript, mohu udělat následující vytvořit metodu trim pro objekt řetězec:

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

Jak mohu jít o dělá v jazyce C # .NET?

Položena 07/08/2008 v 13:00
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
20

Nemůžete dynamicky přidávat metody stávajících objektů nebo tříd v .NET, s výjimkou změnou zdroje pro danou třídu.

Můžete však v jazyce C # 3.0, k rozšíření používání metod, které vypadají jako nové metody, ale jsou kompilace-time magic.

Chcete-li to pro váš kód:

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

Pokud jej chcete použít:

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

To vypadá jako nové metody, ale bude sestavit přesně stejným způsobem jako tento kód:

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

Co přesně se snažíte dosáhnout? Možná, že existují lepší způsoby, jak dělat to, co chcete?

Odpovězeno 07/08/2008 v 13:04
zdroj uživatelem

hlasů
4

Vypadá to, že mluvíš metody C # 's rozšířením. Přidání funkce do stávajících tříd po vložení karty „této“ klíčové slovo před první parametr. Tato metoda má být statické metody ve statické třídě. Řetězce v .NET již mají na „Trim“ metodu, takže budu používat jiný příklad.

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

Takže teď každý řetězec má nesmírně užitečnou metodu ContainsMabster, které mohu použít například takto:

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

Všimněte si, že můžete také přidat rozšíření metody rozhraní (např IList), což znamená, že každá třída se provádí toto rozhraní bude také vyzvednout tuto novou metodu.

Jakékoli další parametry, které deklarují ve způsobu prodloužení (po prvním „tohoto“ parametru), je považován za normálních parametrů.

Odpovězeno 07/08/2008 v 13:09
zdroj uživatelem

hlasů
0

Použití 3.5 kompilátoru můžete použít metodu rozšíření:

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

Můžete použít na CLR 2,0 cíleného projektu (3,5 překladačů) tím, že zahrnuje tento hack:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
Odpovězeno 07/08/2008 v 13:04
zdroj uživatelem

hlasů
0

Musíte vytvořit metodu rozšíření, které vyžaduje .NET 3.5. Způsob musí být statické, ve statické třídě. První parametr metody je třeba s předponou „tohoto“ v podpisu.

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

Potom můžete jej nazvat

"asdfas".MyMethod();
Odpovězeno 07/08/2008 v 13:03
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more