Внедрить из ExpandoObject с помощью ValueInjecter

Я использую ValueInjecter для сопоставления объектов и пытаюсь внедрить из ExpandoObject. Я нашел пример инъекции из динамического файла.

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

Но мне не удалось заставить его работать с ExpandoObject. Как я могу это сделать?


person jdennis    schedule 29.07.2011    source источник
comment
См. этот вопрос для получения более полного ответа.   -  person nawfal    schedule 20.07.2014


Ответы (2)


Я использовал тот же подход, что и Omu, читающий из ExpandoObject, полученного из XML. Поскольку все свойства представлены в виде «строки», я немного изменил ответ @Omu, используя метод «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);
        }
    }
}
person RMalke    schedule 18.06.2014

person    schedule
comment
@nawfal, вы нашли решение для поддержки вложенных типов? - person Rami A.; 02.11.2018