annotate HowTo/Reflection/ObjectFactory.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using NUnit.Framework;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 namespace HowTo.Reflection
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 [TestFixture]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public class ObjectFactoryTest
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 /*[a]*/[ObjectFactory(typeof(Person.ObjectFactory))]/*[/a]*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 public class Person
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 [MapField("PersonID")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 public int ID;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 public string LastName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public string FirstName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 public string MiddleName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 /*[a]*/class ObjectFactory : IObjectFactory/*[/a]*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 public object /*[a]*/CreateInstance(TypeAccessor typeAccessor, InitContext context)/*[/a]*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 // Get the object type indicator field.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 object objectType = context.DataSource.GetValue(context.SourceObject, "PersonType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 // Target ObjectMapper must be changed in order to provide correct mapping.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 switch ((string)objectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 case "D": /*[a]*/context.ObjectMapper = ObjectMapper<Doctor>. Instance;/*[/a]*/ break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 case "P": /*[a]*/context.ObjectMapper = ObjectMapper<Patient>.Instance;/*[/a]*/ break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 // Create an object instance.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 // Do not call ObjectMapper.CreateInstance as it will lead to infinite recursion.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 return context.ObjectMapper./*[a]*/TypeAccessor/*[/a]*/.CreateInstance(context);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 public class /*[a]*/Doctor : Person/*[/a]*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 public string Taxonomy;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 public class /*[a]*/Patient : Person/*[/a]*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 public string Diagnosis;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 public void Test()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 using (DbManager db = new DbManager())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 List<Person> list = db
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 .SetCommand(@"
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 SELECT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 ps.*,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 d.Taxonomy,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 p.Diagnosis,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 CASE
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 WHEN d.PersonID IS NOT NULL THEN 'D'
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 WHEN p.PersonID IS NOT NULL THEN 'P'
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 END as PersonType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 FROM
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 Person ps
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 LEFT JOIN Doctor d ON d.PersonID = ps.PersonID
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 LEFT JOIN Patient p ON p.PersonID = ps.PersonID
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 ORDER BY
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 ps.PersonID")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 .ExecuteList<Person>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 Assert.AreEqual(list[0].GetType(), /*[a]*/typeof(Doctor)/*[/a]*/);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 Assert.AreEqual(list[1].GetType(), /*[a]*/typeof(Patient)/*[/a]*/);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 if (list.Count > 2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 Assert.AreEqual(list[2].GetType(), typeof(Person));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 }