2015-02-24 16 views
13

'dan bağımsız olarak uygulanıp uygulanmadığını denetleme Şu anki projemde çok fazla yansıtma yapıyorum ve her şeyi düzenli tutmak için birkaç yardımcı yöntem sağlamaya çalışıyorum.Tür veya örneğinin IE T

public static bool IsEnumerable(this Type type) 
{ 
    return (type is IEnumerable); 
} 

public static bool IsEnumerable(this object obj) 
{ 
    return (obj as IEnumerable != null); 
} 

Ben onları test: -

bir tür veya örnek IEnumerable uygulayan olmadığını belirlemek için yöntemler bir çift sunmak istiyorum bakılmaksızın İşte tip T. şu anda ne var kullanarak:

Debug.WriteLine("Type IEnumerable: " + typeof(IEnumerable).IsEnumerable()); 
Debug.WriteLine("Type IEnumerable<>: " + typeof(IEnumerable<string>).IsEnumerable()); 
Debug.WriteLine("Type List:   " + typeof(List<string>).IsEnumerable()); 
Debug.WriteLine("Type string:  " + typeof(string).IsEnumerable()); 
Debug.WriteLine("Type DateTime:  " + typeof(DateTime).IsEnumerable()); 
Debug.WriteLine("Instance List:  " + new List<string>().IsEnumerable()); 
Debug.WriteLine("Instance string: " + "".IsEnumerable()); 
Debug.WriteLine("Instance DateTime: " + new DateTime().IsEnumerable()); 

Ben sonuç olarak bu olsun:

Type IEnumerable: False 
Type IEnumerable<>: False 
Type List:   False 
Type string:  False 
Type DateTime:  False 
Instance List:  True 
Instance string: True 
Instance DateTime: False 

tip yöntemi yapmak hiç işe görünmüyor - Ben en azından doğrudan System.Collections.IEnumerable maç için bir gerçek bekleniyordu.

Dizenin teknik olarak numaralandırılabileceğinin farkındayım, ancak birkaç uyarı da olsa. İdeal olarak bu durumda, bunun için yanlış dönmek için yardımcı yönteme ihtiyacım olacaktır. Doğru olması için tanımlı bir IEnumerable<T> türüyle örneklere ihtiyacım var.

Muhtemelen oldukça açık bir şeyi özlüyorum - kimse bana doğru yönde işaret edebilir mi?

+0

Soruyu anlamıyorum. 'Typeof()' niçin herhangi bir tür 'true' geri dönmediği açıktır. _type object_'nin arayüzü kendisi değil, arabirimi uygulayıp uygulamadığını sorarsınız. Belki de 'IsAssignableFrom() 'istiyorsun? Ama hangi yolla 'string' uygun değil? "Tanımlanmış bir IEnumerable " türü var. –

+0

Evet, bu tür bir sorun oldu - Ben tüm gün türleri ve örnekler arasında atlama yansıma yuva bakıyordu ve biraz karıştı daha var! 'string' yeterlilik kazanır, ancak bu durumda gerçekten onu yönetmem gerekiyor - muhtemelen bu aşamada bir yöntem isimlendirme meselesi. Sanırım bunu olduğu gibi bırakacağım ve ilk önce dizgiyi kontrol eden bir tane daha ekleyeceğim. – Octopoid

+0

@JeroenMostert ile katılıyorum ... "yinelenen" bir tür yansıtma kullanarak IEnumerable 'uygulayıp uygulamadığını soruyor, bu bir tür farklı bir şey olduğunu ve farklı bir çözüm gerektiriyor, 'IEnumerable' uygulamak olup olmadığını soruyor (kabul edilen farklı yanıtlar tarafından kanıtlandığı gibi) – Jcl

cevap

22

değil açıkça "Type örneğidir, typeIEnumerable ise"

return (type is IEnumerable); 

soruyor aşağıdaki satırı. Sen yapmak istiyorum

şudur: Eğer kolayca ImplementsInterface değiştirebilir birden arayüzleri kontrol etmek istiyorsa,

public static void ImplementsInterface(this Type type, Type interface) 
{ 
    bool implemented = type.GetInterfaces().Contains(interface); 
    return implemented; 
} 

O yolu:

return typeof(IEnumerable).IsAssignableFrom(type); 
+0

@Octopoid bir dize IENumerable 'uygular, bu yüzden doğrudur, çünkü bu – Jcl

+0

@Octopoid için soruyorsunuz. Doğru davranış budur. 'string'' IEnumerable' olan IEnumerable 'dir. –

+0

Evet, 'string' yeterlilik kazanıyor, ancak bu durumda gerçekten onu yönetmem gerekiyor - muhtemelen bu aşamada bir yöntem adlandırma meselesi.Sanırım bunu olduğu gibi bırakacağım ve ilk önce dizgiyi kontrol eden bir tane daha ekleyeceğim. – Octopoid