我有一个问题,我不知道怎么问。看到;我有这样一个实体:
public class Person{
public int Id {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
并且还具有与实体具有相同属性的视图模型:
public class PersonModel{
public int Id {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
我的问题是:如何创建一个自动转换器来从其中一个读取属性,并创建一个新的另一个并从第一个写入属性?见:
// DAL
public class Repository{
public void Save(Person person){
// saving a person entity
}
}
// BLL
public class Service{
public void CreatePerson(PersonModel model){
var person = new Person{
Id = model.Id,
FirstName = model.FirstName,
LastName = model.LastName
};
new Repository().Save(person);
}
}
当我想将所有视图模型从服务传递到存储库时,我必须重复此代码以将所有视图模型转换为实体。我知道explicit
和implicit
,我不想使用它们。我的意思是我正在寻找一种通过反射和泛型自动绑定它们的方法。例如:
public class Binder{
public TOut Bind<TIn, TOut>(TIn inObject){ }
}
让大家知道我应该从哪里开始,或者在哪里可以找到一些资源来学习这个?谢谢你提前。
答案 0 :(得分:3)
看看这个。它非常适合您的问题: AutoMapper
示例:
public User Create(User obj) {
var rep = UnitOfWork.Create<User>();
var usr = Mapper.Map(obj, rep.Create());
rep.Add(usr);
return usr;
}
如果要在映射时忽略某些属性:
Mapper.CreateMap<User, User>()
.ForMember(dest => dest.ID, opt => opt.Ignore()) // Dont map the ID.
如果你想使用反射,那么这是一个例子。但是为了记录。这只是 工作方式的一小部分。如果它是通用类型,数组或其他内容,则它不起作用!
var modelProperties = this.GetType().GetProperties();
foreach(var prop in usr.GetType().GetProperties()) {
var thisProp = modelProperties.FirstOrDefault(n => n.Name == prop.Name);
if(thisProp != null) {
var value = prop.GetValue(usr, null);
thisProp.SetValue(this, value, null);
}
}
答案 1 :(得分:0)
您可以使用扩展方法将属性复制到另一个对象:
public static class ConvertPersonToPersonModel
{
public static PersonModel ConvertToPersonModel(this Person person)
{
PersonModel p= new PersonModel(); //assign the properties
p.Id = person.Id;
p.FirstName = person.FirstName;
return p;
}
public static IEnumerable<PersonModel> ConvertPeopleToPeopleModels(this List<Person> people)
{
List<PersonModel> ps= new List<PersonModel>();
foreach (var person in people)
{
ps.Add(ConvertToPersonModel(person));
}
return ps.AsEnumerable<PersonModel>();
}
}
ConvertPersonToPersonModel()方法现在将显示在您的Person对象上,例如
Person p = new Person
p.ConvertToPersonModel();