如何转换两类泛型



我有两个类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;
}
}

最新更新