Creating and Using a Custom <T> List in C #

I am trying to use an individual list, I have added some additional tools. I want to apply this list to a long list of customized classes that I created. All classes have an identification number, and some of the tools in the list use an identifier.

Here is the part of my code that I am trying to use. Hope this helps to understand my problem.

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>(); } } 
+7
source share
1 answer

I think your custom list must impose some restrictions on the generic type in order to allow this. I would update your signature to something like

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

Here I used IIdentity as an interface defining an ID , but could also be a class.

To update the code, I would do something like this:

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

I changed the identifier in Customer as a property instead of an instance variable.

+5
source

All Articles