2011-07-29 19 views
5

Nesne eşleme için ValueInjecter kullanıyorum ve ExpandoObject öğesinden enjekte etmeye çalışıyorum. Bir dinamikten enjekte etme örneği buldum.ValueInjecter ile ExpandoObject öğesinden enjekte etme

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

Ancak, bir ExpandoObject ile çalışmaya başlamasında başarılı olamadım. Bunu nasıl yapabilirim?

+0

bakınız [bu q] (http://stackoverflow.com/questions: tüm özellikler olarak'string' gelir olarak, bu yüzden omu cevabı'Convert.ChangeType' yöntemi kullanılarak küçük @ uğraştık Daha eksiksiz bir cevap için/19529178/özyinelemeli-expandoobject). – nawfal

cevap

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

İç içe türlerini işlemek için daha fazla çalışma gerekiyor – nawfal

1

ExpandoObject that comes from a XML adresinden Omu yayınlanmış okuma ile aynı yaklaşımı kullandım.

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