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
Makai
source share1 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
Tomas jansson
source share