2011-03-18 20 views
5

Çalışma zamanı, genel bir araca özgü olmayan genel bir arabirimin üyelerine başvurularda izin verilebilseydi, bunun yararlı olabileceğini düşünüyor mu? Her zamanki "geçici çözüm", genel arabirim için temel olarak genel olmayan bir arabirim oluşturmak olduğunu biliyorum, ancak temel olarak otomatik olan bu temel arabirime karşı geçerli bir neden var mı?jenerik arabirimler için soyut başvurular

public interface IProcessor<T> 
{ 
    string Name { get; } 
    void Process(T item); 
} 

Ben otomatik böyle bir şey izin verecek uygun olacağını düşünüyorum: Ben buna karşı argümanları duymak merak ediyorum

public void LogProcessor(IProcessor<> item) 
{ 
     Trace.WriteLine(item.Name); 
} 

(diğer aşağıdaki arayüz Verilen örnek için

, "tembel olmayı bırak ve sadece temel arayüzü yaz" dan daha iyi.

public void LogProcessor<T>(IProcessor<T> item) 
{ 
    Trace.WriteLine(item.Name); 
} 
+1

Orada ne demek istediğini nereden biliyorsunuz? –

+1

Böyle bir özelliği işlemek için C# dinamik olarak yazılmalıdır. –

+1

Paul Sasik. Derleme sonrasında bu kod, jenerikler için temel arayüz oluşturabilir. Ve bu bir fikir, ancak bazı sorunlara neden olabilir ... – Evgeny

cevap

7

sadece genel yöntemi kullanabilirsiniz. Ve bu tür şeyleri eklemek microsoft framework geliştiricileri için çalışmanın ve testlerin büyük bir parçasıdır. Bu yüzden daha kolay temel arayüzünü eklemektir. Ama yine de size microsoft forumlarına fikir gönderebilirsiniz

+0

Yapabilirim, ama T'nin ne olduğunu bilmediğim bir bağlamdan ne haber? Örneğin, IProcessor <> arabirimini uygulayan bir derlemede tüm sınıfların dinamik olarak yüklenmesini (ve isimlerini yazmayı) istersek (t.GetInterface kullanarak arayüzü kontrol edebilirim (typeof (IProcessor <>). Ad) ! = boş)? – WuffaloWill

+0

@WuffaloWIll: Genel olanı kontrol edebilir, sonra genel yöntemini çağırmak için yansımayı kullanabilirsiniz (uygun yöntemle MethodInfo.MakeGenericMethod: http://msdn.microsoft.com/en-us/library/system.reflection. methodinfo.makegenericmethod.aspx). Güzel değil, ama birçok durumda işe yarayacak. Bununla birlikte, relfection kullanmadığınız normal API'ler için, bu mükemmel çalışır. –

+0

@ Reed- Cevabınız için teşekkürler. "Normal API'lerde" genel yöntemleri nasıl kullanacağımı anlıyorum; Asıl cevabımı, "T'nin ne olduğunu umurumda değil. – WuffaloWill

0

değil ortak dil özelliğidir asıl sebebi: