2008-09-16 14 views
3

burada yaptığım şey:System.Type değişkenlerinde "is" operatörü nasıl kullanılır?

object ReturnMatch(System.Type type) 
{ 
    foreach(object obj in myObjects) 
    { 
     if (obj == type) 
     { 
      return obj; 
     } 
    } 
} 

Ancak, eğer type'in bir alt sınıfı ise, eşleşmeyecektir. Ama işlevin is operatörünü kullanıyormuşum gibi geri dönmesini istiyorum.

Aşağıdakileri denedim, ancak derlemeyeceğim:

if (obj is type) // won't compile in C# 2.0 

En iyi çözüm şu oldu:

if (obj.GetType().Equals(type) || obj.GetType().IsSubclassOf(type)) 

is operatörünü kullanmanın bir yolu yok kodu daha temiz mi?

cevap

4

ben IsAssignableFrom yöntemini kullandım.

Type theTypeWeWant; // From argument or whatever 
foreach (object o in myCollection) 
{ 
    if (theTypeWeWant.IsAssignableFrom(o.GetType)) 
     return o; 
} 

veya sorunla çalışmıyor olabilir başka bir yaklaşım genel bir yöntem kullanmaktır:

private T FindObjectOfType<T>() where T: class 
{ 
    foreach(object o in myCollection) 
    { 
     if (o is T) 
      return (T) o; 
    } 
    return null; 
} 

(Kod bellekten yazılı ve test değildir)

2

belki

type.IsAssignableFrom(obj.GetType()) 
+0

Eğer yapamam operatör 'kullanmak' bu en iyi çözüm olurdu ... – Jonas

0

operatörü başka obeject (genellikle süper sınıfı) gibi bir nesne artığını 'güvenli' olacaktır olup olmadığını işaret eder.

if(obj is type) 

obj bunun, o zaman (tip) obj olarak obj döküm 'güvenli' olduğu gibi, eğer ifadesi succeede olacaktır 'type' ya da bir alt bölgesinin ise.

bkz: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx

0

sen kendini anahtar kelime "olduğunu" kullanamazsınız bir sebebi var mı?

foreach(object obj in myObjects) 
{ 
    if (obj is type) 
    { 
    return obj; 
    } 
} 

DÜZENLEME - Eksik olduğumu görüyorum. Isak'ın önerisi doğru olanıdır; Test ettim ve onayladım.

class Level1 
    { 
    } 

    class Level2A : Level1 
    { 
    } 

    class Level2B : Level1 
    { 
    } 

    class Level3A2A : Level2A 
    { 
    } 


    class Program 
    { 
    static void Main(string[] args) 
    { 
     object[] objects = new object[] {"testing", new Level1(), new Level2A(), new Level2B(), new Level3A2A(), new object() }; 


     ReturnMatch(typeof(Level1), objects); 
     Console.ReadLine(); 
    } 


    static void ReturnMatch(Type arbitraryType, object[] objects) 
    { 
     foreach (object obj in objects) 
     { 
     Type objType = obj.GetType(); 

     Console.Write(arbitraryType.ToString() + " is "); 

     if (!arbitraryType.IsAssignableFrom(objType)) 
      Console.Write("not "); 

     Console.WriteLine("assignable from " + objType.ToString()); 

     } 
    } 
    } 
+0

Evet var: C# buna izin vermez… –

+0

Ah aptalca, sen kodun kendisinde bir _hard_coding_ değilsin, ama Yansıma için bir Type değişkeninden geçiyorsun karşılaştırması. – icelava

İlgili konular