2013-10-21 16 views
11

Angenommen, ich habe ein Objekt, das ein Datenfeld darstellt. Dieses Objekt benötigt die folgenden Eigenschaften: Name, Typ, Wert, Länge. Hier ist das Objekt:Generische Liste von generischen Objekten

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; } 
} 

ich Generika verwendet haben, weil ich den Benutzer des Codes zwingen wollen nur in der Lage sein einen Wert von bestimmten Art zuzuordnen.
Jetzt ist das Problem, wenn ich eine Liste von Feldern erstellen möchte.
Wenn ich die Liste wie List<Field<object>> erstellen, dann können wir einen beliebigen Wert zu einem bestimmten Feld in der Liste zuweisen, und wenn wir nach Type fragen, erhalten wir 'Objekt'.
Die Sache ist - auf dieser Liste möchte ich einige Felder mit Strings, einige mit Ints, Datumsangaben und sogar benutzerdefinierte Objekte, die wiederum eine Liste von Feldern haben ...
Ist die Generika eine gute Lösung für so etwas wie Das? Wenn ja, wie würde ich es umsetzen? Wenn nicht, was ist ein besserer Weg?

--- EDIT ---
einfach ein wenig mehr Hintergrund hinzuzufügen:
1. Ich könnte eine Liste von Feldern wollen, und jedes Feld werden verschiedene Datentypen halten, etwa so:

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

2. Später werde ich diese Objekte abfragen müssen, und deren Attribute automatisch in einer Schleife, so etwas wie das:

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

Was genau willst du? Ich verstehe diesen Satz nicht: "Auf dieser Liste möchte ich vielleicht einige Felder, die Strings enthalten, wenige Ints, Daten und sogar benutzerdefinierte Objekte, die wiederum eine Liste von Feldern haben." – Florian

+0

Genau das, was es sagt, werde ich nur wenige haben verschiedene Listen von Feldern, aber jedes Feld in dieser Liste enthält möglicherweise einen anderen Datentyp (int, string oder ein benutzerdefiniertes Objekt). –

Antwort

9

Ja, Generika ist eine gute Wahl. Der Schlüssel Typsicherheit zu erreichen (und die Art der Type Eigenschaft identifizieren zu sein, ist eine Abstraktion zwischen der Liste und Field<T> Klasse hinzuzufügen.

haben Field<T> implementieren die Schnittstelle IField. Diese Schnittstelle keine Mitglieder benötigen.

erklären Sie dann Ihre Liste als List<IField> zu sein.

diese Weise können Sie die Liste beschränken sich nur auf Felder enthalten, aber jedes Feld kann von einem anderen Typ sein.

später die Werte tun, nur zu lesen, um dann

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

Das würde ein Problem mit der Erstellung der Liste lösen, aber es würde nicht das Problem lösen, Werte zurückzulesen, da ich jetzt in ein passendes Feld <_type_> umwandeln müsste, und ich kenne den \ _type \ _ nicht diese Zeit ... –

+0

@DanielGruszczyk Warum würdest du spielen müssen?Beide werden gut funktionieren: var field = list [index] oder IField field = list [index] –

+0

Ich werde es überprüfen, da die Schnittstelle würde mir wirklich viel besser passen, da ich bestimmte Methoden auf der Klasse erzwingen kann :) –

10

Ich schlage vor, Sie eine Schnittstelle zu definieren und Feld implementiert diese Schnittstelle

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; } 
    } 

so können Sie diesen Code schreiben:

var list = new List<IField>(); 

jetzt diese Liste ein beliebiges Objekt vom Typ enthalten Field<T>

+1

Was ist der Vorteil einer bestehenden Antwort zu wiederholen? –

+7

Es war nur 4 Minuten zwischen ihnen. Wenn du ein langsamer Typ bist wie ich, hast du vielleicht die andere Antwort nicht bemerkt. –

+1

Ja, ich habe die andere Antwort nicht bemerkt :) – VahiD

Verwandte Themen