annotate Source/Reflection/MetadataProvider/ExtensionMetadataProvider.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +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;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.DataAccess;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using Convert=System.Convert;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 namespace BLToolkit.Reflection.MetadataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 using Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public class ExtensionMetadataProvider : MetadataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 #region Helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 private static object GetValue(TypeExtension typeExtension, MemberAccessor member, string elemName, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 AttributeExtensionCollection ext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 isSet = typeExtension[member.Name].Attributes.TryGetValue(elemName, out ext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 return isSet ? ext.Value : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 #region GetFieldName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 var value = GetValue(typeExtension, member, "MapField", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 return value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 return base.GetFieldName(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 #region GetFieldStorage
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 public override string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 var value = GetValue(typeExtension, member, "FieldStorage", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 return value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 return base.GetFieldStorage(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 #region GetInheritanceDiscriminator
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 public override bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 var value = GetValue(typeExtension, member, "IsInheritanceDiscriminator", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 return TypeExtension.ToBoolean(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 return base.GetInheritanceDiscriminator(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 #region GetMapIgnore
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 var value = GetValue(typeExtension, member, "MapIgnore", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 return TypeExtension.ToBoolean(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 return base.GetMapIgnore(typeExtension, member, out isSet) || GetAssociation(typeExtension, member) != null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 #region GetMapField
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 public override MapFieldAttribute GetMapField(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 var extList = typeExtension[member.Name]["MapField"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 if (extList != AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 var attr = new MapFieldAttribute();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 var extFormat = extList.FirstOrDefault(x => x.Name == "Format");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 var extMapName = extList.FirstOrDefault(x => x.Name == "MapName");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 var extIsInheritanceDiscriminator = extList.FirstOrDefault(x => x.Name == "IsInheritanceDiscriminator");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 var extOrigName = extList.FirstOrDefault(x => x.Name == "OrigName");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 var extStorage = extList.FirstOrDefault(x => x.Name == "Storage");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 if (extFormat != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 attr.Format = (string)extFormat.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 if (extMapName != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 attr.MapName = (string)extMapName.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 if (extFormat != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 attr.IsInheritanceDiscriminator = Convert.ToBoolean(extIsInheritanceDiscriminator.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 if (extFormat != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 attr.OrigName = (string)extOrigName.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 if (extFormat != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 attr.Storage = (string)extStorage.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 return attr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 return base.GetMapField(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 #region GetDbType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 public override DbTypeAttribute GetDbType(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 var extList = typeExtension[member.Name]["DbType"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 if (extList != AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 var attr = new DbTypeAttribute(DbType.String);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 var extDbType = extList.FirstOrDefault(x => x.Name == "DbType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 var extSize = extList.FirstOrDefault(x => x.Name == "Size");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 DbType dbType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 if (extDbType != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 #if SILVERLIGHT || FW4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 DbType.TryParse(extDbType.Value.ToString(), out dbType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 dbType = (DbType)Enum.Parse(typeof(DbType), extDbType.Value.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 attr.DbType = dbType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 if (extSize != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 attr.Size = int.Parse(extSize.Value.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 return attr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 return base.GetDbType(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 #region GetPrimaryKey
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 public override PrimaryKeyAttribute GetPrimaryKey(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 var extList = typeExtension[member.Name]["PrimaryKey"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 if (extList != AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 int order = -1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 var extOrder = extList.FirstOrDefault(x => x.Name == "Order");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 if (extOrder != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 order = int.Parse(extOrder.Value.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 var attr = new PrimaryKeyAttribute(order);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 return attr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 return base.GetPrimaryKey(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 #region GetTrimmable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 public override bool GetTrimmable(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 if (member.Type == typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 var value = GetValue(typeExtension, member, "Trimmable", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 return TypeExtension.ToBoolean(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 return base.GetTrimmable(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 #region GetMapValues
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 public override MapValue[] GetMapValues(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 var extList = typeExtension[member.Name]["MapValue"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 if (extList == AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 return GetMapValues(typeExtension, member.Type, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 var list = new List<MapValue>(extList.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 foreach (var ext in extList)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 var origValue = ext["OrigValue"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 if (origValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 origValue = TypeExtension.ChangeType(origValue, member.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 list.Add(new MapValue(origValue, ext.Value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 return list.ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 const FieldAttributes EnumField = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 static List<MapValue> GetEnumMapValues(TypeExtension typeExt, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 List<MapValue> mapValues = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 var fields = type.GetFields();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 foreach (var fi in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 if ((fi.Attributes & EnumField) == EnumField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 var attrExt = typeExt[fi.Name]["MapValue"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 if (attrExt.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 var list = new List<object>(attrExt.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 var origValue = Enum.Parse(type, fi.Name, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 list.AddRange(from ae in attrExt where ae.Value != null select ae.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 if (list.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 if (mapValues == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 mapValues = new List<MapValue>(fields.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 mapValues.Add(new MapValue(origValue, list.ToArray()));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 return mapValues;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 static List<MapValue> GetTypeMapValues(TypeExtension typeExt, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 var extList = typeExt.Attributes["MapValue"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 if (extList == AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 var attrs = new List<MapValue>(extList.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 foreach (var ext in extList)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 var origValue = ext["OrigValue"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 if (origValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 origValue = TypeExtension.ChangeType(origValue, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 attrs.Add(new MapValue(origValue, ext.Value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 return attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 public override MapValue[] GetMapValues(TypeExtension typeExt, Type type, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 List<MapValue> list = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 if (TypeHelper.IsNullable(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 type = type.GetGenericArguments()[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 list = GetEnumMapValues(typeExt, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 if (list == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 list = GetTypeMapValues(typeExt, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 isSet = list != null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 return isSet? list.ToArray(): null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 #region GetDefaultValue
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 var value = typeExtension[member.Name]["DefaultValue"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 return TypeExtension.ChangeType(value, member.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 return GetDefaultValue(mappingSchema, typeExtension, member.Type, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExt, Type type, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 object value = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 value = GetEnumDefaultValueFromExtension(typeExt, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 if (value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 value = typeExt.Attributes["DefaultValue"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 isSet = value != null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 return TypeExtension.ChangeType(value, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 private static object GetEnumDefaultValueFromExtension(TypeExtension typeExt, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 var fields = type.GetFields();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 foreach (var fi in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 if ((fi.Attributes & EnumField) == EnumField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 if (typeExt[fi.Name]["DefaultValue"].Value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 return Enum.Parse(type, fi.Name, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 #region GetNullable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 public override bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 // Check extension <Member1 Nullable='true' />
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 var value = GetValue(typeExtension, member, "Nullable", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 if (isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 return TypeExtension.ToBoolean(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 // Check extension <Member1 NullValue='-1' />
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 if (GetValue(typeExtension, member, "NullValue", out isSet) != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 return base.GetNullable(mappingSchema, typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 #region GetNullable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 public override bool GetLazyInstance(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 // Check extension <Member1 Nullable='true' />
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 var value = GetValue(typeExtension, member, "LazyInstance", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 if (isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 return TypeExtension.ToBoolean(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 // Check extension <Member1 NullValue='-1' />
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 if (GetValue(typeExtension, member, "LazyInstance", out isSet) != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 return base.GetLazyInstance(mappingSchema, typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 #region GetNullable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 public override object GetNullValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 // Check extension <Member1 NullValue='-1' />
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 var value = GetValue(typeExtension, member, "NullValue", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 return isSet? TypeExtension.ChangeType(value, member.Type): null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 #region GetDbName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 public override string GetDatabaseName(Type type, ExtensionList extensions, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 var typeExt = TypeExtension.GetTypeExtension(type, extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 var value = typeExt.Attributes["DatabaseName"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 return value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 return base.GetDatabaseName(type, extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 #region GetOwnerName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 public override string GetOwnerName(Type type, ExtensionList extensions, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 var typeExt = TypeExtension.GetTypeExtension(type, extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 var value = typeExt.Attributes["OwnerName"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 return value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 return base.GetOwnerName(type, extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 #region GetTableName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 public override string GetTableName(Type type, ExtensionList extensions, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 var typeExt = TypeExtension.GetTypeExtension(type, extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 var value = typeExt.Attributes["TableName"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 return value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 return base.GetTableName(type, extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 #region GetPrimaryKeyOrder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 public override int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 var value = typeExt[member.Name]["PrimaryKey"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 return (int)TypeExtension.ChangeType(value, typeof(int));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 return base.GetPrimaryKeyOrder(type, typeExt, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 #region GetNonUpdatableFlag
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 public override NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 var value = typeExt[member.Name]["NonUpdatable"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 return (bool)TypeExtension.ChangeType(value, typeof(bool)) ? new NonUpdatableAttribute() : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 value = typeExt[member.Name]["Identity"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 isSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 return (bool)TypeExtension.ChangeType(value, typeof(bool)) ? new IdentityAttribute() : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 return base.GetNonUpdatableAttribute(type, typeExt, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 #region GetSqlIgnore
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 public override bool GetSqlIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 var value = GetValue(typeExtension, member, "SqlIgnore", out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 return TypeExtension.ToBoolean(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 return base.GetSqlIgnore(typeExtension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 #region GetRelations
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 public override List<MapRelationBase> GetRelations(MappingSchema schema, ExtensionList typeExt, Type master, Type slave, out bool isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 var relations = new List<MapRelationBase>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 var ext = typeExt != null ? typeExt[master] : TypeExtension.Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 isSet = ext != TypeExtension.Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 if (!isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 return relations;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 var ta = TypeAccessor.GetAccessor(master);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 foreach (var mex in ext.Members.Values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 var relationInfos = mex.Attributes[TypeExtension.NodeName.Relation];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 if (relationInfos == AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 var destinationTypeName = relationInfos[0][TypeExtension.AttrName.DestinationType, string.Empty].ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 var destinationType = slave;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 var ma = ta[mex.Name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 var toMany = TypeHelper.IsSameOrParent(typeof(IEnumerable), ma.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 if (destinationTypeName == string.Empty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 if (toMany)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 throw new InvalidOperationException("Destination type should be set for enumerable relations: " + ma.Type.FullName + "." + ma.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 destinationType = ma.Type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 if (!destinationTypeName.Contains(","))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 destinationTypeName += ", " + ta.OriginalType.Assembly.FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 destinationType = Type.GetType(destinationTypeName, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 catch (TypeLoadException ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 throw new InvalidOperationException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 "Unable to load type by name: " + destinationTypeName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 + "\n may be assembly is not specefied, please see Type.GetType(string typeName) documentation",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 ex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 if (slave != null && !TypeHelper.IsSameOrParent(slave, destinationType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 var masterIndexFields = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 var slaveIndexFields = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 foreach (var ae in relationInfos[0].Attributes[TypeExtension.NodeName.MasterIndex])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 masterIndexFields.Add(ae[TypeExtension.AttrName.Name].ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 foreach (var ae in relationInfos[0].Attributes[TypeExtension.NodeName.SlaveIndex])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 slaveIndexFields.Add(ae[TypeExtension.AttrName.Name].ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 if (slaveIndexFields.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 var accessor = toMany ? ta : TypeAccessor.GetAccessor(destinationType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 var tex = TypeExtension.GetTypeExtension(accessor.Type, typeExt);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 slaveIndexFields = GetPrimaryKeyFields(schema, accessor, tex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 if (slaveIndexFields.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 throw new InvalidOperationException("Slave index is not set for relation: " + ma.Type.FullName + "." + ma.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 var slaveIndex = new MapIndex(slaveIndexFields.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 var masterIndex = masterIndexFields.Count > 0 ? new MapIndex(masterIndexFields.ToArray()) : slaveIndex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592 var mapRelation = new MapRelationBase(destinationType, slaveIndex, masterIndex, mex.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594 relations.Add(mapRelation);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 isSet = relations.Count > 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599 return relations;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604 #region GetAssociation
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 public override Association GetAssociation(TypeExtension typeExtension, MemberAccessor member)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 if (typeExtension == TypeExtension.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 var mex = typeExtension[member.Name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 if (mex == MemberExtension.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 var attrs = mex.Attributes[TypeExtension.NodeName.Association];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 if (attrs == AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 return new Association(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 member,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 Association.ParseKeys(attrs[0]["ThisKey", string.Empty].ToString()),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 Association.ParseKeys(attrs[0]["OtherKey", string.Empty].ToString()),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 attrs[0]["Storage", string.Empty].ToString(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 TypeExtension.ToBoolean(attrs[0]["Storage", "True"], true));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 #region GetInheritanceMapping
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633 public override InheritanceMappingAttribute[] GetInheritanceMapping(Type type, TypeExtension typeExtension)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 var extList = typeExtension.Attributes["InheritanceMapping"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637 if (extList == AttributeExtensionCollection.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 return Array<InheritanceMappingAttribute>.Empty;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 var attrs = new InheritanceMappingAttribute[extList.Count];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 for (var i = 0; i < extList.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 var ext = extList[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 attrs[i] = new InheritanceMappingAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648 Code = ext["Code"],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 IsDefault = TypeExtension.ToBoolean(ext["IsDefault", "False"], false),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 Type = Type.GetType(Convert.ToString(ext["Type"]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 return attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 }