30

データのフィールドを表すオブジェクトがあるとします。そのオブジェクトには、名前、タイプ、値、長さのプロパティが必要です。オブジェクトは次のとおりです。

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、日付、さらにはフィールドのリストを持つカスタムオブジェクトを保持するフィールドがほとんど必要ない場合があります...
ジェネリックはそのようなものに対する良い解決策ですか? はいの場合、どのように実装しますか?そうでない場合、より良い方法は何ですか?

---編集---
背景を追加するだけです:
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. 後で、これらのオブジェクトとその属性をループ内で自動的に照会する必要があります。たとえば、次のようになります。

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

3 に答える 3

23

はい、ジェネリックは良い選択です。型安全性を達成する (そしてTypeプロパティで型を識別する) ための鍵は、リストとField<T>クラスの間に抽象化を追加することです。

インターフェイスをField<T>実装していますIField。このインターフェイスにはメンバーは必要ありません。

次に、リストを として宣言しますList<IField>

このようにして、リストにフィールドのみが含まれるように制限しますが、各フィールドは異なるタイプにすることができます。

後で値を読み取るには、次のようにします

foreach(var field in list)
{
    var type = field.Type;
    ....
}
于 2013-10-21T09:44:18.363 に答える