Mercurial > pub > bltoolkit
comparison UnitTests/CS/Reflection/ObjectFactoryAttributeTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System; | |
| 2 | |
| 3 using NUnit.Framework; | |
| 4 | |
| 5 using BLToolkit.Reflection; | |
| 6 using System.Reflection; | |
| 7 using System.Collections.Generic; | |
| 8 using BLToolkit.Mapping; | |
| 9 | |
| 10 namespace Reflection | |
| 11 { | |
| 12 [TestFixture] | |
| 13 public class ObjectFactoryAttributeTest | |
| 14 { | |
| 15 [ObjectFactory(typeof(TestObject.Factory))] | |
| 16 public class TestObject | |
| 17 { | |
| 18 public TestObject() | |
| 19 { | |
| 20 throw new InvalidOperationException(); | |
| 21 } | |
| 22 | |
| 23 private TestObject(int n) | |
| 24 { | |
| 25 Number = n; | |
| 26 } | |
| 27 | |
| 28 public int Number; | |
| 29 | |
| 30 public class Factory : IObjectFactory | |
| 31 { | |
| 32 object IObjectFactory.CreateInstance(TypeAccessor typeAccessor, InitContext context) | |
| 33 { | |
| 34 return new TestObject(53); | |
| 35 } | |
| 36 } | |
| 37 } | |
| 38 | |
| 39 [Test] | |
| 40 public void Test() | |
| 41 { | |
| 42 TestObject o = (TestObject)TypeAccessor.CreateInstanceEx(typeof(TestObject)); | |
| 43 | |
| 44 Assert.AreEqual(53, o.Number); | |
| 45 } | |
| 46 | |
| 47 [ObjectFactory(typeof(Record.Factory))] | |
| 48 public class Record | |
| 49 { | |
| 50 public class Factory : IObjectFactory | |
| 51 { | |
| 52 #region IObjectFactory Members | |
| 53 | |
| 54 public object CreateInstance(TypeAccessor typeAccessor, InitContext context) | |
| 55 { | |
| 56 Type t = typeAccessor.Type; | |
| 57 | |
| 58 ConstructorInfo[] ctis = t.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); | |
| 59 ConstructorInfo constructor = ctis[0]; | |
| 60 | |
| 61 foreach (ConstructorInfo ci in ctis) | |
| 62 { | |
| 63 if (constructor.GetParameters().Length < ci.GetParameters().Length) | |
| 64 constructor = ci; | |
| 65 } | |
| 66 | |
| 67 ParameterInfo[] pis = constructor.GetParameters(); | |
| 68 object[] param = new object[pis.Length]; | |
| 69 | |
| 70 for(int i = 0; i < pis.Length; i++) | |
| 71 { | |
| 72 ParameterInfo pi = pis[i]; | |
| 73 Type pType = pi.ParameterType; | |
| 74 string pName = pi.Name; | |
| 75 int ordinal = context.DataSource.GetOrdinal(pName); | |
| 76 | |
| 77 if (ordinal >= 0) | |
| 78 { | |
| 79 param[i] = context.MappingSchema.ConvertChangeType( | |
| 80 context.DataSource.GetValue(context.SourceObject, ordinal), | |
| 81 pType); | |
| 82 } | |
| 83 else | |
| 84 param[i] = context.MappingSchema.GetDefaultValue(pType); | |
| 85 } | |
| 86 | |
| 87 context.StopMapping = true; | |
| 88 | |
| 89 return constructor.Invoke(param); | |
| 90 | |
| 91 } | |
| 92 | |
| 93 #endregion | |
| 94 } | |
| 95 | |
| 96 public Record(string name, int value) | |
| 97 { | |
| 98 _name = name; | |
| 99 _value = value; | |
| 100 } | |
| 101 | |
| 102 private string _name; | |
| 103 public string Name { get { return _name; } } | |
| 104 | |
| 105 private int _value; | |
| 106 public int Value { get { return _value; } } | |
| 107 } | |
| 108 | |
| 109 [Test] | |
| 110 public void RecordFactoryTest() | |
| 111 { | |
| 112 Record s = new Record("Elvis", 101); | |
| 113 Record r = Map.ObjectToObject<Record>(s); | |
| 114 | |
| 115 Assert.IsNotNull(r); | |
| 116 | |
| 117 Assert.AreEqual(s.Value, r.Value); | |
| 118 Assert.AreEqual(s.Name, r.Name); | |
| 119 } | |
| 120 } | |
| 121 } |
