2008-08-07 15 views

Odpowiedz

20

Nie można dynamicznie dodać metod do istniejących obiektów lub klas w .NET, z wyjątkiem zmiany źródła dla tej klasy.

Można jednak w C# 3.0, użyć metod rozszerzeń, które wyglądają jak nowe metody, ale są magii podczas kompilacji.

Aby to zrobić dla swojego kodu:

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

Aby go użyć:

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

To wygląda jak nowa metoda, ale zostanie skompilowany dokładnie tak samo, jak ten kod:

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

Co dokładnie próbujesz osiągnąć? Być może istnieją lepsze sposoby robienia tego, co chcesz?

+0

Dzięki Lassevk, świetna odpowiedź :) W odpowiedzi na pytanie "Co dokładnie próbujesz osiągnąć?". Od czasu do czasu potrzebuję manipulować ciągiem lub innym obiektem. Zamiast wywoływać funkcję do tego, pomyślałem, że lepiej nazwać to metodą. Obecnie piszę aplikacje internetowe w Asp.net i nie sądzę, że Asp.net 3.x jeszcze, więc będę musiał czekać na teraz. Ale dziękuję za odpowiedź. – GateKiller

0

Musisz utworzyć metodę rozszerzenia, która wymaga .NET 3.5. Metoda musi być statyczna w klasie statycznej. Pierwszy parametr metody musi być poprzedzony "tym" w podpisie.

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

Następnie można nazwać jak

"asdfas".MyMethod(); 
0

Używanie 3.5 kompilatora można użyć metodę rozszerzenia:

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

Można to wykorzystać na CLR 2.0 projektu ukierunkowanego (3,5 kompilatora) poprzez włączenie tej Hack:

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

Brzmi jak mówisz o rozszerzeniach C#. Możesz dodać funkcjonalność do istniejących klas, wstawiając słowo kluczowe "this" przed pierwszym parametrem. Metoda musi być metodą statyczną w klasie statycznej. Struny w .NET już mają metodę "Trim", więc użyję innego przykładu.

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

Więc teraz każdy łańcuch ma niezwykle użyteczną metodę ContainsMabster, które można używać tak:

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

pamiętać, że można również dodać metody rozszerzenie do interfejsów (np IList), co oznacza, że każda klasa implementująca ten interfejs również podejmie tę nową metodę.

Wszelkie dodatkowe parametry zadeklarowane w metodzie rozszerzenia (po pierwszym "tym" parametrze) są traktowane jako normalne parametry.

Powiązane problemy