2008-08-07 14 views

cevap

20

gibi diyebiliriz.

Ancak, C# 3.0'da, 'un'un yeni yöntemler gibi görünmesini sağlayan, ancak derleme zamanı büyüsü olan uzantı yöntemlerini kullanabilirsiniz.

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

Kullanmak için:

kodunuz için Bunu yapmak için

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

Bu yeni bir yöntem gibi görünüyor, ama bu kod tam olarak aynı şekilde derlenir:

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

Tam olarak neyi başarmaya çalışıyorsunuz? Belki de istediğini yapmanın daha iyi yolları var mı?

public static void Trim(this string s) 
{ 
    // implementation 
} 
Sen bu kesmek dahil ederek bir CLR 2.0 hedeflenen proje (3.5 derleyici) bu kullanabilirsiniz

:

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

Teşekkürler Lassevk, harika cevap :) "Tam olarak ne yapmaya çalışıyorsunuz?" Her şimdi ve tekrar, bir dizeyi veya başka bir nesneyi işlemek için ihtiyacım var. Bunu yapmak için bir işlevi çağırmak yerine, onu bir yöntem olarak çağırmanın daha iyi olacağını düşünürdüm. Şu anda Asp.net'de web uygulamaları yazmaktayım ve Asp.net 3.x'i düşünmüyorum, bu yüzden şimdilik beklemek zorundayım. Ama cevabın için teşekkürler. – GateKiller

0

.NET 3.5 gerektiren bir uzantı yöntemi oluşturmanız gerekir. Yöntemin statik bir statik sınıfta olması gerekir. Yöntemin ilk parametresinin imzadaki "bu" ile önekli olması gerekir.

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

Daha sonra dinamik bu sınıf için kaynak değiştirerek hariç .NET mevcut nesnelere veya sınıflara yöntemleri ekleyemezsiniz

"asdfas".MyMethod(); 
0

bir uzantısı Yöntemini kullanabilirsiniz 3.5 derleyici kullanma C# 's uzantısı yöntemleri hakkında konuşmak gibi. "Bu" anahtar kelimesini ilk parametreden önce ekleyerek mevcut sınıflara işlevsellik eklersiniz. Yöntem, statik bir sınıfta statik bir yöntem olmalıdır. .NET'teki dizeler zaten bir "Trim" yöntemine sahip, bu yüzden başka bir örnek kullanacağım. bunun anlamı da arabirimler (örneğin IList) için uzatma yöntemleri ekleyebilirsiniz

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

Not:

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

Yani artık her dize Böyle kullanabileceğiniz bir derece kullanışlı ContainsMabster yöntemi vardır Bu arayüzü uygulayan herhangi bir sınıf da bu yeni yöntemi alacaktır.

Uzantı yönteminde bildirdiğiniz ek parametreler (ilk "bu" parametresinden sonra) normal parametreler olarak kabul edilir.

4

geliyor

İlgili konular