2015-01-06 15 views
6

Belirli bir tür olup olmadığını kontrol edebileceğim bir yönteme bir tür geçirmeye çalışıyorum. Ancak aşağıda sahip olduğum kod derlenmiyor ve ben neyin yanlış olduğunu merak ediyorum. Derleme hatası: 'dataType' tipi veya ad alanı adı bulunamadı.Tür, yöntem içinden geçirildiğinde 'is' nasıl kullanılır?

public static List<object> findType(Type dataType) 
{ 
    List<object> items = new List<object>(); 
    foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs) 
    { 
     if (entry.Value != null && entry.Value is dataType) 
     { 
      items.Add(entry.Value); 
     } 
    } 
    return items; 
} 

cevap

9

is işleci, bir tür adı bekler, Type örneğini değil. Bu tür derleme zamanında bilinmelidir.

türleri uyumlu olup olmadığını kullanabilirsiniz Ancak IsAssignableFrom yöntem kontrol etmek:

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType()) 
2

Sanırım entry.Value türünü kontrol etmek istiyorsunuz.

bu deneyin: Bu tip Type bir değişken ise

if (entry.Value != null && dataType.GetType().IsAssignableFrom(entry.Value)) 

O kendi başına bir tür olarak dataType bekliyor.

+0

Bu, "olduğu" ile aynı şey değildir. Sadece uyumsuzluk değil, tip eşitliğini kontrol eder. –

+0

Unutmayın, bu 'yinelemeli' çalışır. Yani, belirli türetilmiş sınıfın temel türden olduğunu kontrol ettiğinizde, true (arayüzler dahil) döndürür. Davanızdaki basit bir karşılaştırma bu şekilde çalışmaz. –

+0

Sağ. Umarım şimdi daha iyidir. –

5

is C# özel derlenmiş yapıdır - Tür olarak bir değişken koyamazsınız, gerçek bir türü yazmalısınız ad. Eğer kesin tip kullanımını kontrol etmek isterseniz

bu: Eğer kalıtsal olup olmadığını kontrol etmek istiyorsanız

if(entry.Value.GetType() == dataType) 

, bu kullanabilirsiniz:

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType())) 
0

entry.Value olduğunu bir nesne, her nesne size bir Type nesnesini döndüren GetType() yöntemini aldı. Type.Equal bu türleri karşılaştırabilir. Bunu "is" kelimesini kullanmadan yapabilirsiniz.

Bir nesneyi tarifesi istiyoruz ve

0

yanı sıra bir Type örneği nasıl kullanılacağını gösteren diğer cevaplar, kendi yöntem genel yapabiliriz yazmayın "çünkü" kelime kullanmak olamaz. Bu is kullanmasına izin, ama açıkça derleme zamanında sabit olmak hedef türüne bağlıdır olacaktır: Eğer jenerikleri ve LINQ kullanabiliyorsa

public static List<object> findType<TTarget>() 
{ 
    List<object> items = new List<object>(); 
    foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs) 
    { 
    if (entry.Value != null && entry.Value is TTarget) 
    { 
     … 
2

işler çok daha kolay hale gelir. DataSource.ItemPairs'un bir sözlük tipi olduğu varsayılmaktadır. Veya daha da kısalmaktadır.

public static List<T> findType<T>() 
{ 
    return DataSource.ItemPairs.Values.OfType<T>().ToList(); 
}