2008-09-16 17 views
3
ここで

は私がやっていることです:System.Type変数の "is"演算子の使い方

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

しかし、objがtypeのサブクラスであれば、それは一致しません。しかし、私は演算子isを使用していた場合と同じように関数を返すようにしたいと思います。

is

演算子 isを使用する方法はありませんか?コードをきれいにする?

答えて

4

この問題に直面したとき、私はIsAssignableFromメソッドを使用しました。

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

またはあなたの問題では動作しない場合があります別のアプローチは、一般的な方法で使用することです:

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

(コードがメモリから書かれ、テストされていません)

2

はおそらく

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

をした場合、私がすることはできません使用演算子 'これは最高の解決策になります... – Jonas

0

インクルードは、オペレータが、別のobeject(多くの場合、スーパークラス)として一つのオブジェクトをキャストするために「安全」になるかどうかを示しています。

if(obj is type) 

objが、その、それは(タイプ)は、objとしてOBJをキャストする '安全' であるとして、if文がsucceedeます 'type' 型またはサブクラスである場合。

は、以下を参照してください。http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx

0

あなたが自分自身をキーワード「は」使用できない理由はありますか?

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

EDIT - 私は欠けていたものを見ます。 Isakの提案は正しいものです。私はそれを試して確認しました。

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

はいあります:C#は許可しません... –

+0

ああ、愚かな私は_hard_coding_型ではないコード自身が、比較。 – icelava

関連する問題