2017-12-22 13 views
1

私はこの方法を汎用的なものに変換できると思います。それから私は任意の列挙型のためにそれを使用することができます。これを一般的なものにするには?このIEnumerableループを汎用化するにはどうすればよいですか?

private bool AreAnyInteractablesInThisList(
    IEnumerable<Interactable> Interactables, 
    Interactable InteractableToCheck) 
{ 
    foreach (var Interactable in Interactables) 
    { 
     if (Interactable.GetInstanceID() == InteractableToCheck.GetInstanceID()) 
      return true; 
    } 
    return false; 
} 
+3

すべての型に 'GetInstanceID()'メソッドがあるわけではないので、これを一般化することはできません。 – Loris156

+1

..あなたはインターフェイスやベースクラスを追加しない限り(上から続行するため)。あなたのコード構造を知らないと、私たちはこれに答えることはできません。私はまたなぜですか?これを一般的なものにしたいのですか?あなたは何を得ることを望みますか? – Liam

+0

こんにちはLiam、私はこれをユーティリティスクリプトにすることができればと思います。たとえば、「Liam」というクラスがあるとします。私はまた、Liamが私のLiamリストに入っているかどうか確認したいと思う。 – Jim

答えて

3

あなたはGetInstanceID()メソッド宣言インタフェースを作成する必要があるでしょう:

public interface IInteractable 
{ 
    int GetInstanceID(); // I guess it's an int, but you can change that accordingly 
} 

をして、一般的な引数は、そのインターフェイスを実装する必要があり、制約を持つメソッドがジェネリックます

private bool AreAnyInteractablesInThisList<T>(IEnumerable<T> Interactables, T InteractableToCheck) where T : IInteractable 
{ 
    foreach (var Interactable in Interactables) 
    { 
     if (Interactable.GetInstanceID() == InteractableToCheck.GetInstanceID()) return true; 
    } 
    return false; 
} 

メソッドを短縮すると、次のようになります。

private bool AreAnyInteractablesInThisList<T>(IEnumerable<T> Interactables, T InteractableToCheck) where T : IInteractable 
{ 
    // I cache this ID (assuming it was not changing with each call) 
    int idToCheck = InteractableToCheck.GetInstanceID(); 
    return Interactables.Any(interactable => interactable.GetInstanceID() == idToCheck); 
} 
関連する問題