c#电话簿项目的通用方法
c# Generic methods for phonebook project
我正在尝试制作电话簿项目,其中我 write/read 来自 bin 文件的数据,我在域 class 库中有两个 class,用户和联系人,现在我想要在 FileManager class、add/edit/delete 和 Get 中创建私有通用函数,对于 Contact 和 User find/work,
我怎么知道 private T Get<T>(int id) where T : class
函数中给出的是哪种类型?使其适用于多种
如何正确完成这些功能?
namespace Phonebook.Data
{
public class FileManager
{
protected string DataFilePath => @"D:\Data.bin";
protected IList<User> Users { get; set; }
protected IList<Contact> Contacts { get; set; }
public IEnumerable<Contact> SearchContacts(Func<Contact, bool> predicate)
{
foreach ( var contact in Contacts )
if ( predicate(contact) )
yield return contact;
}
public IEnumerable<Contact> AllContacts()
{
return SearchContacts(x => true);
}
public Contact GetContact(int contactID)
{
return Get<Contact>(contactID);
}
private T Get<T>(int id) where T : class
{
return null;
}
private int GenerateContactID()
{
int id = 0;
foreach ( var contact in AllContacts() )
if ( contact.ContactID > id )
id = contact.ContactID;
return id + 1;
}
public void AddContact(Contact contact)
{
contact.ContactID = GenerateContactID();
Contacts.Add(contact);
}
public void EditContact(Contact contact)
{
Edit<Contact>(contact);
}
public void DeleteContact(int contactID)
{
Delete<Contact>(contactID);
}
//add edit da delete generic for both, user / contacts
private void Add<T>(T entry)
{
}
private void Edit<T>(T entry)
{
}
private void Delete<T>(int id)
{
}
#region Data Load/Save Methods
public IEnumerable<Contact> LoadData()
{
using ( FileStream fileStream = new FileStream(DataFilePath, FileMode.Open) )
using ( BinaryReader reader = new BinaryReader(fileStream) )
{
List<Contact> contacts = new List<Contact>();
reader.BaseStream.Position = 0;
while ( reader.PeekChar() != -1 )
{
Contact contact = new Contact();
contact.ContactID = reader.ReadInt32();
contact.FirstName = reader.ReadString();
contact.LastName = reader.ReadString();
contact.Phone = reader.ReadString();
contact.EMail = reader.ReadString();
contact.UserID = reader.ReadInt32();
contacts.Add(contact);
}
return contacts;
}
}
public void SaveData(IEnumerable<Contact> contact)
{
using ( FileStream fileStream = new FileStream(DataFilePath, FileMode.OpenOrCreate) )
using ( BinaryWriter writer = new BinaryWriter(fileStream) )
foreach ( var item in contact )
{
writer.Write(item.ContactID);
writer.Write(item.FirstName);
writer.Write(item.LastName);
writer.Write(item.Phone);
writer.Write(item.EMail);
writer.Write(item.UserID);
}
}
#endregion
}
}
我认为您应该为用户和联系人 class 分别创建一个通用接口及其实现。如果出现新的 class,例如 Employee - 您将执行此接口的新实现,而 User 和 Contact classes 中没有任何更改。如果源不是二进制文件,而是数据库 - 那么这个接口的单独实现。
如下:
interface IManager<TEntity> where TEntity : class
{
IList<TEntity> GetAll();
TEntity GetById(int id);
void Add(TEntity entity);
void Update(TEntity entity);
void Remove(int id);
int GenerateContactId();
IList<TEntity> Search(Func<TEntity, bool> p);
}
class BinaryContactManager : IManager<Contact>
{
public void Add(Contact entity)
{
throw new NotImplementedException();
}
public int GenerateContactId()
{
throw new NotImplementedException();
}
public IList<Contact> GetAll()
{
throw new NotImplementedException();
}
public Contact GetById(int id)
{
throw new NotImplementedException();
}
public void Remove(int id)
{
throw new NotImplementedException();
}
public IList<Contact> Search(Func<Contact, bool> p)
{
throw new NotImplementedException();
}
public void Update(Contact entity)
{
throw new NotImplementedException();
}
}
class BinaryUserManager : IManager<User>
{
public void Add(User entity)
{
throw new NotImplementedException();
}
public int GenerateContactId()
{
throw new NotImplementedException();
}
public IList<User> GetAll()
{
throw new NotImplementedException();
}
public User GetById(int id)
{
throw new NotImplementedException();
}
public void Remove(int id)
{
throw new NotImplementedException();
}
public IList<User> Search(Func<User, bool> p)
{
throw new NotImplementedException();
}
public void Update(User entity)
{
throw new NotImplementedException();
}
}
我正在尝试制作电话簿项目,其中我 write/read 来自 bin 文件的数据,我在域 class 库中有两个 class,用户和联系人,现在我想要在 FileManager class、add/edit/delete 和 Get 中创建私有通用函数,对于 Contact 和 User find/work,
我怎么知道 private T Get<T>(int id) where T : class
函数中给出的是哪种类型?使其适用于多种
如何正确完成这些功能?
namespace Phonebook.Data
{
public class FileManager
{
protected string DataFilePath => @"D:\Data.bin";
protected IList<User> Users { get; set; }
protected IList<Contact> Contacts { get; set; }
public IEnumerable<Contact> SearchContacts(Func<Contact, bool> predicate)
{
foreach ( var contact in Contacts )
if ( predicate(contact) )
yield return contact;
}
public IEnumerable<Contact> AllContacts()
{
return SearchContacts(x => true);
}
public Contact GetContact(int contactID)
{
return Get<Contact>(contactID);
}
private T Get<T>(int id) where T : class
{
return null;
}
private int GenerateContactID()
{
int id = 0;
foreach ( var contact in AllContacts() )
if ( contact.ContactID > id )
id = contact.ContactID;
return id + 1;
}
public void AddContact(Contact contact)
{
contact.ContactID = GenerateContactID();
Contacts.Add(contact);
}
public void EditContact(Contact contact)
{
Edit<Contact>(contact);
}
public void DeleteContact(int contactID)
{
Delete<Contact>(contactID);
}
//add edit da delete generic for both, user / contacts
private void Add<T>(T entry)
{
}
private void Edit<T>(T entry)
{
}
private void Delete<T>(int id)
{
}
#region Data Load/Save Methods
public IEnumerable<Contact> LoadData()
{
using ( FileStream fileStream = new FileStream(DataFilePath, FileMode.Open) )
using ( BinaryReader reader = new BinaryReader(fileStream) )
{
List<Contact> contacts = new List<Contact>();
reader.BaseStream.Position = 0;
while ( reader.PeekChar() != -1 )
{
Contact contact = new Contact();
contact.ContactID = reader.ReadInt32();
contact.FirstName = reader.ReadString();
contact.LastName = reader.ReadString();
contact.Phone = reader.ReadString();
contact.EMail = reader.ReadString();
contact.UserID = reader.ReadInt32();
contacts.Add(contact);
}
return contacts;
}
}
public void SaveData(IEnumerable<Contact> contact)
{
using ( FileStream fileStream = new FileStream(DataFilePath, FileMode.OpenOrCreate) )
using ( BinaryWriter writer = new BinaryWriter(fileStream) )
foreach ( var item in contact )
{
writer.Write(item.ContactID);
writer.Write(item.FirstName);
writer.Write(item.LastName);
writer.Write(item.Phone);
writer.Write(item.EMail);
writer.Write(item.UserID);
}
}
#endregion
}
}
我认为您应该为用户和联系人 class 分别创建一个通用接口及其实现。如果出现新的 class,例如 Employee - 您将执行此接口的新实现,而 User 和 Contact classes 中没有任何更改。如果源不是二进制文件,而是数据库 - 那么这个接口的单独实现。
如下:
interface IManager<TEntity> where TEntity : class
{
IList<TEntity> GetAll();
TEntity GetById(int id);
void Add(TEntity entity);
void Update(TEntity entity);
void Remove(int id);
int GenerateContactId();
IList<TEntity> Search(Func<TEntity, bool> p);
}
class BinaryContactManager : IManager<Contact>
{
public void Add(Contact entity)
{
throw new NotImplementedException();
}
public int GenerateContactId()
{
throw new NotImplementedException();
}
public IList<Contact> GetAll()
{
throw new NotImplementedException();
}
public Contact GetById(int id)
{
throw new NotImplementedException();
}
public void Remove(int id)
{
throw new NotImplementedException();
}
public IList<Contact> Search(Func<Contact, bool> p)
{
throw new NotImplementedException();
}
public void Update(Contact entity)
{
throw new NotImplementedException();
}
}
class BinaryUserManager : IManager<User>
{
public void Add(User entity)
{
throw new NotImplementedException();
}
public int GenerateContactId()
{
throw new NotImplementedException();
}
public IList<User> GetAll()
{
throw new NotImplementedException();
}
public User GetById(int id)
{
throw new NotImplementedException();
}
public void Remove(int id)
{
throw new NotImplementedException();
}
public IList<User> Search(Func<User, bool> p)
{
throw new NotImplementedException();
}
public void Update(User entity)
{
throw new NotImplementedException();
}
}