2013-05-10 11 views
7

Sto tentando di utilizzare un elenco personalizzato in cui sono stati aggiunti alcuni strumenti aggiuntivi. Voglio applicare questo elenco a un lungo elenco di classi personalizzate che ho creato. Tutte le classi hanno un numero identificativo e alcuni strumenti nella lista usano l'ID.Creazione e utilizzo di un elenco personalizzato <T> in C#

Ecco una parte del mio codice che sto cercando di utilizzare. Spero che questo ti aiuti a capire il mio problema.

namespace Simple_Point_of _Sales_System 
{ 
    public class MyList<T> : List<T> 
    { 
     internal int SetID() 
     { 
      return this.Max(n => n.ID) + 1; 
     } 
     internal T Find(int ID) 
     { 
      return this.Find(n => n.ID == ID); 
     } 
     internal T Add(T n) 
     { 
      Read(); 
      Add(n); 
      Write(); 
      return n; 
     } 
     internal void Remove(int ID) 
     { 
      Read(); 
      if (this.Exists(t => t.ID == ID)) RemoveAll(t => t.ID == ID); 
      else MessageBox.Show(GetType().Name + " " + ID + " does not exist.", "Missing Item", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Write(); 
     } 
     internal void Edit(int ID, T n) 
     { 
      Read(); 
      if (this.Exists(t => t.ID == ID)) this[FindIndex(t => t.ID == ID)] = n; 
      else MessageBox.Show(GetType().Name + " " + ID + " does not exist.", "Missing Item", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Write(); 
     } 
     internal MyList<T> Read() 
     { 
      Clear(); 
      StreamReader sr = new StreamReader(@"../../Files/" + GetType().Name + ".txt"); 
      while (!sr.EndOfStream) 
       Add(new T().Set(sr.ReadLine())); 
      sr.Close(); 
      return this; 
     } 
     internal void Write() 
     { 
      StreamWriter sw = new StreamWriter(@"../../Files/" + GetType().Name + ".txt"); 
      foreach (T n in this) 
       sw.WriteLine(n.ToString()); 
      sw.Close(); 
     } 
    } 

    public class Customer 
    { 
     public int ID; 
     public string FirstName; 
     public string LastName; 
    } 

    public class Item 
    { 
     public int ID { get; set; } 
     public string Category { get; set; } 
     public string Name { get; set; } 
     public double Price { get; set; } 
    } 

    public class MyClass 
    { 
     MyList<Customer> Customers = new MyList<Customer>(); 
     MyList<Item> Items = new MyList<Item>(); 
    } 
} 
+5

Poiché la tua lista personalizzata ha a che fare solo con Room perché non crei Rooms: List ? – ysrb

+1

Dovresti usare i vincoli su 'T', quindi assicurati solo di consentire classi che hanno un campo o una proprietà' ID'. Fai creare un'interfaccia per far rispettare questo, se non puoi ereditare. Ma cosa vuoi veramente sapere? –

risposta

5

Penso che l'elenco personalizzato debba applicare alcuni vincoli sul tipo generico per consentirlo. Vorrei aggiornare la tua firma a qualcosa di simile

public class MyList<T> : List<T> where T : IIdentity { .... } 

Qui ho usato IIdentity come interfaccia che definisce ID, ma potrebbe anche essere una classe.

Per aggiornare il codice che vorrei fare qualcosa di simile:

public interface IIdentity 
{ 
    int ID { get; } 
} 

public class Customer : IIdentity 
{ 
    public int ID { get; set;} 
    public string FirstName; 
    public string LastName; 
} 

public class Item : IIdentity 
{ 
    public int ID { get; set; } 
    public string Category { get; set; } 
    public string Name { get; set; } 
    public double Price { get; set; } 
} 

ho cambiato l'ID in Customer ad essere una proprietà anziché variabile di istanza.

+0

Sembra funzionare. Grazie – Makai

+1

@Makai, se è la risposta alla tua domanda dovresti contrassegnare la risposta come corretta per aiutare gli altri. –

Problemi correlati