2017-04-21 8 views
0

"MyObject"タイプのオブジェクトのリストがあります。このクラスにはorderedDictionaryが含まれます。私が使用したいorderedDictionaryは私の一般的な機能 オブジェクト内の順序付き辞書を使用する汎用関数

public class MyObject 
{ 
    public OrderedDictionary Columns { get; set; } 
} 

汎用関数で

ある

private void KeepSelectedColumns<T>(List<T> OperateList) 
    { 
     List<string> ToBeRemoved = new List<string>(); 
     foreach (T fVal in OperateList) 
     { 
      // error in fVal.Columns 
      foreach (DictionaryEntry Col in fVal.Columns) 
      { 
       ... 
       ... 
      } 
     } 
    } 

コンパイラエラーは「T」が「列」と拡張子なしのメソッド「列」の定義が含まれていないです

+1

あなたが言ったように 'List 'を持っているのなら、なぜ汎用関数が必要なのですか?あるいは、あなたのリストは 'MyObject'から継承したいくつかの他の型を保存していますか? – Seprum

答えて

1

は、それが「何を」することができます。

たとえば、List<int>を渡すことができますが、これはパラメータを満足するため、intにはColumnsのメンバーがありません。

ここにジェネリック薬を入れてもよろしいですか? MyObjectを他のクラスの基本クラスとして使用していない限り、明示的に「一般的ではない」振る舞いが望まれます。

MyObjectは、基底クラスである場合は、ジェネリックを使用することができますが、より多くの種類の制約を提供する必要があるでしょう - あなたの関数のシグネチャは次のようになります。型制約の詳細については、

private void KeepSelectedColumns<T>(List<T> OperateList) where T : MyObject 

を参照してくださいhere

1

これを派生した型でこれを使用したい場合は、MyObjectがこのような制約をどこに追加しますか

(日本語訳はありません)しかし、すべてあなたが コンパイラは文句を言い Columnsと呼ばれるメンバプロパティを持っているので、typeパラメータ Tとして渡すことができません - あなたは Tの種類に制限を与えないので
private void KeepSelectedColumns<T>(List<T> OperateList) where T : MyObject 
{ 
     List<string> ToBeRemoved = new List<string>(); 
     foreach (T fVal in OperateList) 
     { 
      // error in fVal.Columns 
      foreach (DictionaryEntry Col in fVal.Columns) 
      { 
      } 
     } 
} 
関連する問題