我想以某种方式使用c# -
中的反射将实体对象映射到业务对象public class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
}
我的实体类具有相同的属性,CategoryId和CategoryName。任何使用反射或动态的最佳实践都将受到赞赏。
答案 0 :(得分:15)
您可以使用Automapper或Valueinjecter
编辑:
好的我写了一个使用反射的函数,请注意它不会处理映射属性不完全相等的情况,例如IList不会映射List
public static void MapObjects(object source, object destination)
{
Type sourcetype = source.GetType();
Type destinationtype = destination.GetType();
var sourceProperties = sourcetype.GetProperties();
var destionationProperties = destinationtype.GetProperties();
var commonproperties = from sp in sourceProperties
join dp in destionationProperties on new {sp.Name, sp.PropertyType} equals
new {dp.Name, dp.PropertyType}
select new {sp, dp};
foreach (var match in commonproperties)
{
match.dp.SetValue(destination, match.sp.GetValue(source, null), null);
}
}
答案 1 :(得分:0)
http://automapper.codeplex.com/
我的投票是自动映射器。我目前正在使用它。我已经对它进行了性能测试,虽然它没有手绘图(如下)那么快:
Category c = new Category
{
id = entity.id,
name = entity.name
};
映射权衡自动使其成为一个明显的选择,至少对于实体到业务层的映射。我实际上是从业务层到视图模型的手绘图,因为我需要灵活性。
答案 2 :(得分:0)
我写这篇文章是为了做我认为你想做的事情而你不必投出业务对象:
public static TEntity ConvertObjectToEntity<TEntity>(object objectToConvert, TEntity entity) where TEntity : class
{
if (objectToConvert == null || entity == null)
{
return null;
}
Type BusinessObjectType = entity.GetType();
PropertyInfo[] BusinessPropList = BusinessObjectType.GetProperties();
Type EntityObjectType = objectToConvert.GetType();
PropertyInfo[] EntityPropList = EntityObjectType.GetProperties();
foreach (PropertyInfo businessPropInfo in BusinessPropList)
{
foreach (PropertyInfo entityPropInfo in EntityPropList)
{
if (entityPropInfo.Name == businessPropInfo.Name && !entityPropInfo.GetGetMethod().IsVirtual && !businessPropInfo.GetGetMethod().IsVirtual)
{
businessPropInfo.SetValue(entity, entityPropInfo.GetValue(objectToConvert, null), null);
break;
}
}
}
return entity;
}
用法示例:
public static Category GetCategory(int id)
{
return ConvertObjectToEntity(Database.GetCategoryEntity(id), new Category());
}