2009-08-01 10 views
6

türetilmiş sınıfları görünmesi için bir temel sınıf uzantısı yöntemleri ekleme: AncakC#: bunlar şu anda bu gibi System.Windows.Forms.Control bir uzantısı yöntemi vardır

public static void ExampleMethod(this Control ctrl){ /* ... */ } 

, bu yöntem değildir PictureBox gibi, Control'den türetilen sınıflarda görünür. Yalnızca Denetim'de değil, denetimden türetilen sınıflar için açık bir döküm yapmak zorunda kalmadan görünen bir uzantı yöntemi oluşturabilir miyim?

+0

Olası yinelenen [I genişletilmiş türde bir temel sınıftan bir uzantısı yöntemi diyemezsin Neden?] (http://stackoverflow.com/questions/27883427/why-cant-i-call-an- genişletilmiş-tipi-genişletilmiş-tipi-uzantısı uzantısı) –

cevap

13

Sen uzantıları sınıf tanımlanır veya uzatma yöntemleri kapsamında olmayacak hangi ad alanı için kullanarak ifade bulunmalıdır.

Uzatma yöntemleri türevi türler (System.Linq içinde IEnumerable<T> tanımlanan örneğin uzatma yöntemleri) üzerinde iyi çalışır.

public static void ExampleMethod<T>(this T ctrl) 
    where T : Control 
{ /* ... */ } 

Hayır, .. aynı zamanda yayınlanmıştır olmayan jenerik versiyonu ile çalışmalıdır zorunda için ad eklemek için hatırlamıyorum:

+0

Teşekkür ederim! Farklı bir isim alanında tanımlanmış, bir kullanım ifadesi eklenmiş. – MiffTheFox

+0

İsim ve Kapsam Burada bana yardımcı olan anahtar kelimeler. Teşekkür ederim! – GregoryBrad

8

bir uzantısı yöntemi aslında tüm mirasçılara uygulanacak/(bu durumda, Denetim olarak) genişletilmiş ediliyor Çeşidi uygulamacılarıdır. Uzantı yönteminin bulunduğu ad alanının, aramaya çalıştığınız yerde referans alındığından emin olmak için ifadeleri kullanarak denetlemeyi deneyebilirsiniz.

-2

seni jenerik uzantısı yapmak zorunda düşünüyorum uzantılarınız.

1

Ayrıca uzantıları sonra bunları başvuruda bulunan proje bunları otomatik ithal edecek, bir ad tanımlanmamış sağlayabiliriz.

0

Not uygulanmış uzatma yöntemi sahip olan bir taban sınıfından devralan sınıftaki bir özelliği bir uzatma yöntemi çağrısı, sen this

örneğin uzatma yöntemi soneki zorundaGetValue temel sınıf uygulanan Uzantımın yöntemdir

public int Value 
{ 
    get => this.GetValue<int>(ValueProperty); 
    set => SetValue(ValueProperty, value); 
} 

. arasında