ValueInjecter:将子属性独立注入目标

时间:2015-03-19 20:48:04

标签: c# .net automapper valueinjecter

考虑我有以下课程:

class Destination
{
    public int Id { get; set; }
    public Child MyChild { get; set; }
}

class Child
{
    public string Name { get; set; }
}

在我的Main()方法中:

Child MyChild = new Child() { Name = "Tom" };
Destination dest = new Destination() { Id = 101 };
dest.InjectFrom(MyChild);  // THIS DOESN'T INJECT AND ASSIGN THE OBJECT TO THE Destination.MyChild property.

所以我希望将对象分别映射/注入目标属性。有人可以指导我。

1 个答案:

答案 0 :(得分:0)

ValueInjecter项目只是一种映射项目。 InjectFrom从源对象获取属性并将它们注入目标对象。

  

我想要的是对象本身......

我相信你想要一个浅/深的原型副本。否则你应该注入实例......

您可以实现一些ValueInjecter API来解决您的问题,但是,如果您这样做,那么您的模型将绑定到技术。你必须一遍又一遍地做。所以这似乎是一个坏主意。

我想为您提供另一种解决方案:

    public static T InjectClone<T>(this T source)
    {
    //note: you have to implements HasCopyConstractor & HasDefualtConstractor...

        if (source is ICloneable)
            return (T) ((ICloneable) source).Clone();

        var type = source.GetType();

        if (HasCopyConstractor(type))
            return (T) Activator.CreateInstance(type, source);

        if (HasDefualtConstractor(type))
        {
            var target = (T) Activator.CreateInstance(source.GetType());

            target.InjectFrom(source);

            return target;
        }

        throw new exception.....
    }

    public static T InjectTo<T>(this T source, ref T target)
    {
        if (target == null)
        {
            target = source.InjectClone();
        }
        else
        {
            target.InjectFrom(source);
        }
        return source;
    }

现在您可以通过以下方式实现目标:

dest.MyChild = MyChild.InjectClone();

如果dest.MyChild不是属性,则可以选择InjectTo:

MyChild.InjectTo(ref dest.MyChild);