我有两个类PostSM和Post以及一个BaseService类。我的BaseService类是一个泛型类,有两种类型的类TEntity和TServiceModel。此类将TServiceModel转换为TEntity并将其保存在数据库中。我的问题是如何将TServiceModel转换为TEntity。我在PostSM类中明确地将Post转换为PostSM,将PostSM转换为Post。
public class PostSM
{
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public RowVersion string { get; set; }
public static explicit operator PostSM(Post post)
{
if (post == null)
return null;
else
{
PostSM postSM = new PostSM()
{
Id = post.Id,
Title = post.Title,
Body = post.Body,
RowVersion = post.RowVersion
};
return postSM;
}
}
public static explicit operator Post(PostSM postSM)
{
if (postSM == null)
return null;
else
{
Post post = new Post()
{
Id = postSM.Id,
Title = postSM.Title,
Body = postSM.Body,
RowVersion = postSM.RowVersion
};
return post;
}
}
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public string RowVersion { get; set; }
}
我有一个名为BaseService 的类
public class BaseService<TServiceModel, TEntity>
where TEntity : class
where TServiceModel : class
{
public virtual TServiceModel Add(TServiceModel serviceModel)
{
try
{
TEntity entity = (TEntity)serviceModel;
//var addedEntity = repo.Add(entity);
//uow.SaveChanges();
return serviceModel;
}
catch (Exception)
{
throw;
}
}
}
在BaseService类中的Add Method中,正如我在第一个问题中提到的,我需要将PostSM转换为Post,但由于BaseService是一个泛型类,我不知道如何做到这一点
TEntity entity = (TEntity)servieMoel;
我在Add方法中得到了这一行的错误。
实际上,您无法执行此操作,对泛型类型TEntity和TServiceModel一无所知,因此除了赋值之外,不允许其他操作。
您应该为TServiceModel使用接口,而不是运算符。像
interface IConvert<TTo>
{
TTo Convert()
}
在您的班级PostSM 中实现此接口
class PostSM : IConvert<Post>
{
public Post Convert() => (Post)this;
// or put your explicit operator code here
}
最后对的实现进行约束
public class BaseService<TServiceModel, TEntity>
where TEntity : class
where TServiceModel : class, IConvert<TEntity>
这将允许您致电
TEntity entity = serviceModel.Convert();
在我看来,这里最干净的选项是简单继承。
public class PostSM : Post { }
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public string RowVersion { get; set; }
}
public class BaseService<TServiceModel, TEntity>
where TEntity : class
where TServiceModel : TEntity
{
public virtual TServiceModel Add(TServiceModel serviceModel)
{
TEntity entity = (TEntity)serviceModel;
//var addedEntity = repo.Add(entity);
//uow.SaveChanges();
return serviceModel;
}
}