视图模型到实体绑定器

时间:2012-02-23 10:48:42

标签: c# generics c#-4.0 reflection model-binding

我有一个问题,我不知道怎么问。看到;我有这样一个实体:

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);
    }
}

当我想将所有视图模型从服务传递到存储库时,我必须重复此代码以将所有视图模型转换为实体。我知道explicitimplicit,我不想使用它们。我的意思是我正在寻找一种通过反射和泛型自动绑定它们的方法。例如:

public class Binder{
    public TOut Bind<TIn, TOut>(TIn inObject){ }
}

让大家知道我应该从哪里开始,或者在哪里可以找到一些资源来学习这个?谢谢你提前。

2 个答案:

答案 0 :(得分:3)

AutoMapper - 最佳方式

看看这个。它非常适合您的问题: 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();