I am trying to write a Generic Base Service Class , which after receiving the first list of data as the actual Db Model Entity type needs to be converted to a new general data type .
I tried list.ConvertAll()
, but always got a build error for the ConvertAll()
method.
I also tried list.Cast<TVm>().ToList()
to solve this problem, but get a runtime error.
Here are my code snippets of all classes and interfaces. Any help or suggestion appreciated.
Entity class
public abstract class Entity { [Key] [Index("IX_Id", 1, IsUnique = true)] public string Id { get; set; } [DataType(DataType.DateTime)] public DateTime Created { get; set; } public string CreatedBy { get; set; } [DataType(DataType.DateTime)] public DateTime Modified { get; set; } public string ModifiedBy { get; set; } [DefaultValue(true)] public bool Active { get; set; } }
BaseViewModel Class
public abstract class BaseViewModel<T> where T: Entity { protected BaseViewModel() { } protected BaseViewModel(T model) { Id = model.Id; Created = model.Created; CreatedBy = model.CreatedBy; Modified = model.Modified; ModifiedBy = model.ModifiedBy; Active = model.Active; } public string Id { get; set; } public DateTime Created { get; set; } public string CreatedBy { get; set; } public DateTime Modified { get; set; } public string ModifiedBy { get; set; } public bool Active { get; set; } }
IBaseService Interface
public interface IBaseService<T, TVm> where T : Entity where TVm : BaseViewModel<T> { List<TVm> GetAll(); }
BaseService class
public abstract class BaseService<TEntity, TVm> : IBaseService<TEntity, TVm> where TEntity: Entity where TVm : BaseViewModel<TEntity> { protected IBaseRepository<TEntity> Repository; protected BaseService(IBaseRepository<TEntity> repository) { Repository = repository; } public virtual List<TVm> GetAll() { List<TVm> entities; try { List<TEntity> list = Repository.GetAll().ToList(); entities = list.Cast<TVm>().ToList(); //runtime error entities = list.ConvertAll(x => new TVm(x)); //build error entities = list.ConvertAll(new Converter<TEntity, TVm>(TEntity)); //build error } catch (Exception exception) { throw new Exception(exception.Message); } return entities; } }
source share