-1

コンポーネントと呼ばれるオブジェクトのリストがあるとします。

List<object> components = new List<object>();

クラスengine、wheel、frameのオブジェクトが入力されているとします。ここで、クラスをパラメーターとして受け取り、リストにそのクラスのオブジェクトがある場合にtrueを返す関数を作成します。このような:

public static bool HasComponent( *the class* ) { 
    foreach(object c in components) {
        if(c is *the class*)
           return true;
    }

    return false;
} 

どうすればそれを行うことができますか?出来ますか?

4

7 に答える 7

5

リンクを使用します。

components.OfType<YouType>().Any();
于 2012-09-02T13:49:10.960 に答える
3

ジェネリックを使用する:

public static bool HasComponent<T>() { 
    foreach(object c in components) {
        if(c is T)
           return true;
    }

    return false;
}

あれを呼べ:

Obj.HasComponent<Wheel>();
于 2012-09-02T13:45:31.757 に答える
2

GetType() を呼び出して、.Net 内の任意のオブジェクトのタイプを取得するか、isキーワードを使用できます。実際、次のような LINQ を使用して、リストでこれを行うことができます。

components.Any(x => x is Wheel);

Wheel目的のタイプに置き換えます。

于 2012-09-02T13:47:42.100 に答える
1

このようなもの

public static bool HasComponent<TheType>() 
{  
    foreach(object c in components) 
    { 
        if(c is TheType) 
        {
           return true; 
        }
    }  
    return false; 
}  

またはそれより短い

public static bool HasComponent<TheType>() 
{  
    return components.OfType<TheType>().Count() > 0;
}  

で呼び出す

 HasComponent<TheType>()
于 2012-09-02T13:46:20.350 に答える
0

マルチスレッドアプリケーションを使用している場合は、オブジェクトを検索するときに、そのオブジェクトがリストに含まれていることを確認する必要があります。他のスレッドが検索と同時にこのオブジェクトを削除できるためです。したがって、NullReferenceExceptionがスローされる可能性があります。この状況を回避するために、この関数を使用できます。

 public static bool HasComponent<T>()
 {
    foreach (object c in components)
    {
       lock (c.GetType())
       {
           if (c is T)
           {
              return true;
           }
       }

     }
     return false;
}

ただし、この関数を呼び出すには、リストを静的にする必要があります。

于 2012-09-02T14:22:07.200 に答える
0

これを見つけるには、「foreach」という拡張 for ループを使用する必要があります。これは、すべてのタイプのクラス オブジェクトを走査し、特定のクラスの目的のオブジェクトをチェックして、true または false を返します。

public static bool HasComponent<Type>()  { 
foreach(object c in l) {
    if(object c in Type)
       return true;
    }

    return false;
} 
于 2012-09-02T13:52:43.000 に答える
0

「is」キーワードを使用して提案された回答がいくつかあることは知っていますが、継承の状況では注意が必要です。たとえば、Cow が Animal から派生する場合HasComponent<Cow>()、両方に対して true を返します。問題を回避するには、実際に型を比較す​​る必要があります。

public static bool HasComponent<T>()
{
    return components.Any(i => i.GetType() == typeof(T));
}

もちろん、型を渡すことでジェネリックなしでそれを行うことができますが、ジェネリックは実際に行く方法です:

public static bool HasComponent(Type type)
{
    return components.Any(i => i.GetType() == type);
}
于 2012-09-02T14:34:38.617 に答える