Search code examples
c#mappingvalueinjecter

Inject from ExpandoObject with ValueInjecter


I'm using ValueInjecter for object mapping and I'm trying to inject from an ExpandoObject. I found an example of injecting from a dynamic.

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

But I have not been successful in getting it to work with an ExpandoObject. How can I do this?


Solution

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