我正在使用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.我怎样才能做到这一点?
解决方法
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); } } }