2011-07-29 7 views
5

私はオブジェクトマッピングにValueInjecterを使用しており、ExpandoObjectから注入しようとしています。私はダイナミックから注射の例を見つけました。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で動作させることに成功していません。これどうやってするの?

+0

参照[このQ](http://stackoverflow.com/questions/19529178/recursively-mapping-expandoobject)を参照してください。 – nawfal

答えて

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

ネストされた型を処理するための処理が必要 – nawfal

1

私はOmuと同じ手法をExpandoObject that comes from a XMLから投稿しました。すべてのプロパティは'string'ようにしていたので、私は'Convert.ChangeType'法を用いたOMUの答え@少し微調整してきたように:

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