是否有任何框架可以执行以下操作:
var source = new Entity()
{
StringProp = null,
IntProp = 100,
};
var target = new Entity()
{
StringProp = "stringValue", // Property value should remain the same if source value is null
IntProp = 222
};
var mergedEntity = MergeFramework.Merge(source, target); // Here is what I am looking for
Assert.AreEqual(100, mergedEntity.IntField);
Assert.AreEqual("stringValue", mergedEntity.StringField);
以下是我需要它的工作流程:
App获取实体实例。实例的某些属性为null。 (来源实例)
应用程序从数据库中获取与源中具有相同标识的实体。 (目标实例)
合并两个实体并将合并保存到数据库。
主要问题是我的项目中有近600个实体,所以我不想手动为每个实体编写合并逻辑。基本上,我正在寻找像AutoMapper或ValueInjecter这样的灵活的东西,它们满足以下要求:
提供指定类型合并条件的可能性。例如:if source.IntProp == int.MinInt - >不要合并属性
提供指定特定属性条件的可能性。就像在AutoMapper中一样:
Mapper.CreateMap()。ForMember(dest => dest.EventDate,opt => opt.MapFrom(src => src.EventDate.Date));
答案 0 :(得分:1)
你去:
using System;
using NUnit.Framework;
using Omu.ValueInjecter;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var source = new Entity()
{
StringProp = null,
IntProp = 100,
};
var target = new Entity()
{
StringProp = "stringValue", // Property value should remain the same if source value is null
IntProp = 222
};
var mergedEntity = (Entity) target.InjectFrom<Merge>(source);
Assert.AreEqual(100, mergedEntity.IntProp);
Assert.AreEqual("stringValue", mergedEntity.StringProp);
Console.WriteLine("ok");
}
}
public class Merge : ConventionInjection
{
protected override bool Match(ConventionInfo c)
{
return c.SourceProp.Name == c.TargetProp.Name
&& c.SourceProp.Value != null;
}
}
public class Entity
{
public string StringProp { get; set; }
public int IntProp { get; set; }
}
}
答案 1 :(得分:0)
要更新当前答案,我们已弃用ConventionInjection
。现在,您可以在创建自定义注入时使用LoopInjection
。
更新的Merge
注入类的示例:
public class Merge : LoopInjection
{
protected override bool MatchTypes(Type source, Type target)
{
return source.Name == target.Name;
}
protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp)
{
if (sp.GetValue(source) == null) return;
base.SetValue(source, target, sp, tp);
}
}