Pregunta Inyectar desde ExpandoObject con ValueInjecter


Estoy usando ValueInjecter para la asignación de objetos y estoy tratando de inyectar desde un ExpandoObject. Encontré un ejemplo de inyección desde una dinámica.

   public class Ac
    {
        public string Aa { get; set; }
    }

    [Test]
    public void Aa()
    {
        var o = new { Aa = "aa" };
        dynamic d = o;
        var a = new Ac{ Aa = "bb" };
        a.InjectFrom((object)d);
        Assert.AreEqual(o.Aa, a.Aa);
    }

Pero no he tenido éxito en hacer que funcione con un ExpandoObject. ¿Cómo puedo hacer esto?


5
2017-07-29 22:10


origen


Respuestas:


using System;
using System.Collections.Generic;
using System.Dynamic;
using Omu.ValueInjecter;

namespace ConsoleApplication7
{
    public class FromExpando : KnownSourceValueInjection<ExpandoObject>
    {
        protected override void Inject(ExpandoObject source, object target)
        {
            var d = source as IDictionary<string, object>;
            if (d == null) return;
            var tprops = target.GetProps();

            foreach (var o in d)
            {
                var tp = tprops.GetByName(o.Key);
                if (tp == null) continue;
                tp.SetValue(target, o.Value);
            }
        }
    }

    public class Foo
    {
        public string Name { get; set; }
        public int Ace { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            dynamic x = new ExpandoObject();
            x.Ace = 1231;
            x.Name = "hi";
            var f = new Foo();
            //f.InjectFrom<FromExpando>((object) x); // edit:compilation error
            new FromExpando().Map((object)x,f);
            Console.WriteLine(f.Ace);
            Console.WriteLine(f.Name);
        }
    }
} 

7
2017-08-01 06:48



He utilizado el mismo enfoque que Omu publicó en una lectura ExpandoObject que viene de un XML. Como todas las propiedades vienen en forma de 'cadena', entonces modifiqué un poco la respuesta de @Omu con el método'Convert.ChangeType':

public class FromExpando : KnownSourceValueInjection<ExpandoObject>
{
    protected override void Inject(ExpandoObject source, object target)
    {
        var d = source as IDictionary<string, object>;
        if (d == null) return;
        var tprops = target.GetProps();

        foreach (var o in d)
        {
            var tp = tprops.GetByName(o.Key);
            if (tp == null) continue;

            var newValue = Convert.ChangeType(o.Value, tp.PropertyType); 

            tp.SetValue(target, newValue);
        }
    }
}

1
2018-06-18 17:48