2015-03-03 27 views
6

List<int> 'un GenericTypeDefinition ürününün ICollection<> genel bir arabirimini içermesini beklediğim basit kod. Yine de, bunları düzgün bir şekilde karşılaştırmamı sağlayan List<int>'dan kabul edilebilir bir tür türemiyorum.GenericType Arabirimlerin Karşılaştırılması

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Test 
{ 
    public static void Main() 
    { 
     var a = typeof(List<int>); 
     var b = typeof(ICollection<>); 

     var r1 = a.GetGenericTypeDefinition().GetInterfaces(); 
     foreach (var x in r1) 
     { 
      Console.WriteLine(x); 
     } 
     Console.WriteLine(); 
     Console.WriteLine(b); 
     Console.WriteLine(); 
     Console.WriteLine(r1.Any(x => x == b)); 
    } 
} 

Çıktı

System.Collections.Generic.IEnumerable`1[T] 
System.Collections.Generic.IReadOnlyList`1[T] 
System.Collections.Generic.IReadOnlyCollection`1[T] 
System.Collections.IEnumerable 
System.Collections.Generic.IList`1[T] 
System.Collections.Generic.ICollection`1[T] 
System.Collections.ICollection 
System.Collections.IList 

System.Collections.Generic.ICollection`1[T] 

False 
Ben r1 b eşit olduğu bir tür içerdiğini beklerdik

. Sabit

DÜZENLEME Jon Skeet bana neler olduğunu içine doğru bir fikir verdi. TIList<T> tip parametredir

System.Collections.Generic.IEnumerable`1[T] 
System.Collections.Generic.IReadOnlyList`1[T] 
System.Collections.Generic.IReadOnlyCollection`1[T] 
System.Collections.Generic.ICollection`1[T] 
System.Collections.Generic.IList`1[T] 

System.Collections.Generic.ICollection`1[T] 

True 

cevap

7

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Test 
{ 
    public static void Main() 
    { 
     var a = typeof(List<int>); 
     var b = typeof(ICollection<>); 

     var r1 = a.GetInterfaces() 
      .Where(x => x.IsGenericType) 
      .Select(x => x.GetGenericTypeDefinition()); 

     foreach (var x in r1) 
     { 
      Console.WriteLine(x); 
     } 

     Console.WriteLine(); 
     Console.WriteLine(b); 
     Console.WriteLine(); 
     Console.WriteLine(r1.Contains(b)); 


    } 
} 

çıkış Resim, genel tip tanımı, özellikle ICollection<T> değinecektir.

gibi bir şey vardı düşünün:

public class Foo<T1, T2> : IEnumerable<T1>, IComparable<T2> 

genel tür tanımı tüm bilgileri içerir - Çünkü özellikle IEnumerable<T1> ve IComparable<T2> değil IEnumerable<T2> ve örneğin IComparable<T1> olduğunu "bilir". O türü tarafından uygulanan arayüzleri her biri için genel tür tanımı alarak çeki düzeltebilirsiniz

: sınırının altında

Console.WriteLine(r1.Any(x => x.IsGenericType && 
           x.GetGenericTypeDefinition() == b)); 
+0

Teşekkür ederim, bana ihtiyacım olan bilgiyi verdin. –

0

deneyin ..

Console.WriteLine(r1.Any(x => x.Name == b.Name)); 

yerine

Console.WriteLine(r1.Any(x => x == b)); 
+0

Tür karşılaştırması en güvenli değil. –

+0

Örnek olarak bir şeyler öğrenirseniz memnuniyetle kabul eder. – Amit

+0

Jon'un T tanımlayıcısını sadece İsim dizesindeki T işaretçisine işaret ettiği gibi, diğer Ad dizesinde olduğu gibi T ile aynı değil. –

İlgili konular