2017-07-28 3 views
0

私は非常に似ている2つの方法があります。唯一の違いは、BindingListで使用されているタイプですが、両方のタイプのジェネリックメソッドを作成する方法を考えることはできません。私はそれを動作させるためにジェネリック型を使用しなければならないと思うが、私はそれを理解することはできない。両方のタイプにはTitleというプロパティがあります。非常に似たリストタイプの2つのメソッドを汎用メソッドにリファクタリングするにはどうすればよいですか?

private int GetObjectIndexFromTitle(string str, BindingList<MyClass1> list) 
{ 
    foreach (var item in list) 
    { 
     if (item.Title == str) 
     { 
      return list.IndexOf(item); 
     } 
    } 
    return -1; 
} 

そして、この:

private int GetObjectIndexFromTitle(string str, BindingList<MyClass2> list) 
{ 
    foreach (var item in list) 
    { 
     if (item.Title == str) 
     { 
      return list.IndexOf(item); 
     } 
    } 
    return -1; 
} 

私は、ジェネリック型のドキュメントを通して見てきたが、私はそれがために非常に具体的なTitle財産を動作させることができませんでした。私はこれにいくつかの助けが大好きです。

+3

もし両方が 'Title'プロパティを持っていれば、これは' IHasTitle'のような一般的なインタフェースにとっては良い例です。 –

答えて

4

とのインターフェイスを作成します。

public interface ITitleAware{ 
    string Title { get; } 
} 

あなたのクラスがそれを実装します。次に

public MyClass1 : ITitleAware { 
    //code 
} 

public MyClass2 : ITitleAware { 
    //code 
} 

private int GetObjectIndexFromTitle(string str, BindingList<ITitleAware> list) 
{ 
    foreach (var item in list) 
    { 
     if (item.Title == str) 
     { 
      return list.IndexOf(item); 
     } 
    } 
    return -1; 
} 
+0

答えをありがとう。だから私の通常のクラスのコードは '// code'に入っていますよね? – n00dles

+0

@ n00dlesはい。これらのクラスにTitleがあることを確認してください。それ以外の場合、コードはコンパイルされません。 – gaheinrichs

+0

'GetObjectIndexFromTitle(" string "、MyBindingListClass1)'を呼び出すと、2番目の引数エラーが発生します。 'BindingList はBindingListに変換できません' ... – n00dles

-2
public static class myClass 
    { 
     public static int GetObjectIndexFromTitle<T>(T myList, string myString) 
     { 
      foreach (var item in myList) 
      { 
       if (item.Title == myString) 
       { 
        return list.IndexOf(item); 
       } 
      } 
      return -1; 
     } 
    } 

使用法:

myClass.GetObjectIndexFromTitle<myClass1>(myList1, "myString1"); 
myClass.GetObjectIndexFromTitle<myClass222>(myList2222, "myString222"); 
+0

これはコンパイルされません。 – Kyle

+0

@Kyle myClass1とmyClass222を定義しましたか?私はそうではないと思う。コードフラグメントは、正しい方向を指すベンチマークであることを意味します。 – Ottak

+1

いいえ、あなたの 'GetObjectIndexFromTitle'の実装はそれらを必要とせず、依存していないからです。制約がなければ、 'foreach'ループで' myList'を使用しようとすると( 'T'が列挙可能であることを保証するものがないので)コンパイルエラーが発生し、それを修正しても、 'item'が' Title'プロパティを持つことを保証する制約です。 – Kyle

関連する問題