2013-10-21 11 views
11

データのフィールドを表すオブジェクトがあり、オブジェクトには名前、タイプ、値、長さのプロパティが必要です。ここにオブジェクトがあります:汎用オブジェクトの一般的なリスト

class Field<T> 
{ 
    public string Name { get; set; } 
    public Type Type 
    { 
     get 
     { 
      return typeof(T); 
     } 
    } 
    public int Length { get; set; } 
    public T Value { get; set; } 
} 

コードのユーザーに特定のタイプの値のみを割り当てることができるようにするために、ジェネリックを使用しました。
問題は、フィールドのリストを作成するときです。
List<Field<object>>のようなリストを作成した場合、リストの任意のフィールドに任意の値を割り当てることができます。タイプをクエリすると、「オブジェクト」が取得されます。
このリストには、文字列を保持するフィールドはほとんどなく、int、日付、さらにはカスタムオブジェクトのフィールドも必要です。
ジェネリックスは次のようなそれ?はいの場合、それを実装するにはどうすればいいですか?そうでない場合、より良い方法は何ですか?

--- EDIT ---
ただ、いくつかのより多くの背景を追加するには:
1.私はフィールドのリストをお勧めしますし、各フィールドがそうのように、異なるデータ型を保持します:

List<Field<object>> lst = new List<Field<object>>(); 
lst.Add(new Field<string>()); 
lst.Add(new Field<int>()); 
lst.Add(new Field<SomeObjectFromMyApp>()); 

2.後で私は、これらのオブジェクトを照会する必要があります、とautomaticalyその属性のループでは、そのようなこと:

foreach(Field<object> fld in lst) 
{ 
    Type t = fld.Type; 
    //do some other stuff 
} 
+0

正確に何をしたいですか?私はこの文を理解していません: "そのリストでは、文字列を保持するフィールドがほんの少しで、int、日付、およびカスタムオブジェクトの保持はほんとうにフィールドのリストが必要な場合があります。 – Florian

+0

正確には、リストの各フィールドは異なるデータ型(int、stringまたはカスタムオブジェクト)を保持している可能性があります。 –

答えて

9

はい、ジェネリック医薬品は良い選択です。型の安全性を達成(およびTypeプロパティを持つタイプを識別することにキーは、リストとField<T>クラス間の抽象化を追加することです。

持っField<T>インタフェースIFieldを実装しています。すべてのメンバーを必要としません。このインタフェース。

その後List<IField>であるとして、あなたのリストを宣言します。

をあなただけのフィールドが含まれますが、各フィールドが異なるタイプのものとすることができる。

その後値を読み取るには、ちょうど行うにリストを制限その方法

foreach(var field in list) 
{ 
    var type = field.Type; 
    .... 
} 
+0

それはリストを作成することで問題を解決しますが、適切なフィールド<_type_>にキャストしなければならないので、値を読み込む問題は解決しません。\ _type \ _を知る方法はありませんその時... –

+0

@DanielGruszczykなぜあなたはキャストする必要がありますか?これらのどちらも問題なく動作します:var field = list [index]またはIField field = list [index] –

+0

クラスで特定のメソッドを実行することができるので、インターフェイスが実際にはもっとうまくいくので、私はそれをチェックします:) –

10

私はあなたがインターフェイスを定義することをお勧めとフィールドがインタフェース

public interface IField 
    { 

    } 

public class Field<T> : IField 
    { 
     public string Name { get; set; } 
     public Type Type 
     { 
      get 
      { 
       return typeof(T); 
      } 
     } 
     public int Length { get; set; } 
     public T Value { get; set; } 
    } 

はそうあなたは、このコード書くことができることを実装しています

var list = new List<IField>(); 

今、このリストはタイプField<T>の任意のオブジェクトを含めることができますが

+1

既存の回答を繰り返すことのメリットは何ですか? –

+7

それらの間にはわずか4分しかありませんでした。あなたが私のような遅いタイパーなら、あなたはもう1つの答えに気付かなかったかもしれません。 –

+1

はい私は他の答えを気付かなかった:) – VahiD

関連する問題