2008-10-24 28 views
13

Sınıf içinde genel yazılan bir sınıfın türünü nasıl edinebilirim?.NET: Genel yazılan sınıf içinde türü nasıl kontrol edilir?

Bir örnek:

Ben ıcollection < T> uygulayan bir genel yazılan koleksiyonu oluşturmak. Ben

Ben T verilen tip için yöntemin içinde sorabilirsiniz nasıl
public void Add(T item){ 
     ... 
    } 

    public void Add(IEnumerable<T> enumItems){ 
     ... 
    } 

gibi yöntemleri var içinde?

soruma nedeni: nesne kullanılırsa toplama yerine parametre IEnumerable olsa bile (IEnumerable < object> enumItems) Ekle (nesne öğesi) ekleyin kullanan T olarak. Böylece ilk durumda sayısız koleksiyonun sayısız nesnenin yerine tek bir nesne olarak bütün sayılabilir koleksiyonu ekleyecektir.

Yani ben

if (T is object) { 
    // Check for IEnumerable 
} 

ancak C# çalışamaz elbette

gibi bir şey gerekiyor. Öneriler?

Çok teşekkür ederim!

Michael

cevap

21

Şahsen ben yan ediyorum AddRange için IEnumerable<T> yöntemini yeniden adlandırarak konuyu adım. Bu, bu tür sorunları önler ve List<T>.AddRange gibi mevcut API'lerle tutarlıdır.

T, IEnumerable<T> (nadir, ben kabul ediyorum) eklentilerini eklemek istediğinizde işleri temiz tutar. Eğer bir referans tipine T sınırlamak zorunda genel sınıf/yöntemde is operatörünü kullanmak isterseniz

29

Sen kullanabilirsiniz: typeof(T)

if (typeof(T) == typeof(object)) { 
    // Check for IEnumerable 
} 
+2

Bu başlıkta sorulan soruya cevap verir. – reads0520

-1

:

public void MyMethod<T>(T theItem) where T : class 
{ 
    if (theItem is IEnumerable) { DoStuff(); } 
} 
+0

Ben sadece bir non-generic IEnumerable bir System.Object olarak System.Object –

+0

marxidad, evet, haklı olarak geçtiğinde endişe ediyor. – Mil

İlgili konular