2016-06-12 9 views
2

私は何かをしようとしていますが、これを呼び出す方法はわかりませんが、私はGoogle上で何か有用なものを見つけることはできません。私は、私は喜んでそのリスト内のすべての子を置くことができます親クラスのリストの子クラスのインスタンスを返す汎用メソッド

List<Parent> children = new List<Parent>(); 

を作成するが、私はトラブルにそれらを取得するための汎用的なメソッドを記述している場合、私は、基本クラスに

public class Parent{/*some code here*/} 

と子クラス

public class Child1:Parent{/*more code*/} 
public class Child2:Parent{/*expended behaviour*/} 

を持っています。このような何か:

public T GetChild<T>() 
{ 
    var child = children.Find(c => c.GetType() == typeof(T)); 
    if (child == null) 
     return default(T); 
    return child; 
} 

コンパイラは、最後の行に文句を言うと、私は明示的Tchildをキャストしようとした場合、それはいくつかのより多くの不平を言います。どうすればいいですか、助言してください。

答えて

3

OfTypeメソッドを使用すると、特定のクラスのすべてのインスタンスを取得できます。 children.OfType<T>();次に、単一インスタンスが必要な場合は、FirstまたはFirstOrDefault()メソッドを使用できます。

public T GetChild<T>() 
    { 
     var child = children.OfType<T>().FirstOrDefault(); 
     if (child == null) 
      return default(T); 
     return child; 
    } 

それとも

public T GetChild<T>() 
{ 
    return children.OfType<T>().FirstOrDefault(); 
} 
+0

しかし、2行目と3行目が必要ですか? FirstOrDefaultは何も見つからなければnullを返し、何も見つからなければ私のメソッドからnullを返すことを期待しています。 –

+0

@DreadBoyはい、nullを返す場合は、この行を削除できます。 – Valentin

+0

すごく、私はあなたの答えを受け入れています!ありがとうございました。 –

0

あなたは、キーワード「である」を使用して自分のタイプを見つける必要があり、複数の子供の前で親の種類を確認することができます。何かのように:

if(child is Child1)return Child1; else Child2を返します。

+0

これは、汎用関数の目的を破るだろうか? 10の子クラスがあるとしたら、if節は10個必要です。あるいは、後でもう一人の子供を追加して、この行を忘れると想像してください。どんなに多くの新しい子クラスを追加しても、私が書いてみたい一般的な機能はその仕事をしています。 –

関連する問題