annotate Source/Reflection/Extension/AttributeNameCollection.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 namespace BLToolkit.Reflection.Extension
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 public class AttributeNameCollection : Dictionary<string,AttributeExtensionCollection>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 public new AttributeExtensionCollection this[string attributeName]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 if (this == _null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 return AttributeExtensionCollection.Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 AttributeExtensionCollection ext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 return TryGetValue(attributeName, out ext) ? ext : AttributeExtensionCollection.Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 public void Add(AttributeExtension attributeExtension)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 if (this != _null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 // Add attribute.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 AttributeExtensionCollection attr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 if (!TryGetValue(attributeExtension.Name, out attr))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 Add(attributeExtension.Name, attr = new AttributeExtensionCollection());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 attr.Add(attributeExtension);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 // Convert value type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 bool isType = attributeExtension.Name.EndsWith(TypeExtension.AttrName.TypePostfix);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 if (isType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 string attrName = attributeExtension.Name.Substring(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 0, attributeExtension.Name.Length - 5);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 AttributeExtensionCollection ext =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 (AttributeExtensionCollection)_attributes[attrName];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 if (ext != null && ext.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 ext[0].Values.ChangeValueType(attributeExtension.Value.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 string attrName = attributeExtension.Name + TypeExtension.AttrName.TypePostfix;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 AttributeExtensionCollection ext =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 (AttributeExtensionCollection)_attributes[attrName];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 if (ext != null && ext.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 attributeExtension.Values.ChangeValueType(ext.Value.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 public void Add(string name, string value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 if (this != _null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 var attrName = name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 var valueName = string.Empty;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 var idx = name.IndexOf(TypeExtension.ValueName.Delimiter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 if (idx > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 valueName = name.Substring(idx + 1).TrimStart(TypeExtension.ValueName.Delimiter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 attrName = name.Substring(0, idx);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 if (valueName.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 valueName = TypeExtension.ValueName.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 else if (valueName == TypeExtension.ValueName.Type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 valueName = TypeExtension.ValueName.ValueType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 AttributeExtensionCollection ext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 if (TryGetValue(attrName, out ext))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 ext[0].Values.Add(valueName, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 var attributeExtension = new AttributeExtension { Name = name };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 attributeExtension.Values.Add(valueName, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 Add(attributeExtension);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 private static readonly AttributeNameCollection _null = new AttributeNameCollection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 public static AttributeNameCollection Null
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 get { return _null; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }