annotate Source/Reflection/TypeAccessor.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.ComponentModel;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Data.SqlTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using System.Diagnostics.CodeAnalysis;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using System.IO;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using BLToolkit.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 #if !SILVERLIGHT && !DATA
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using BLToolkit.ComponentModel;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 using BLToolkit.EditableObjects;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 using BLToolkit.TypeBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 using BLToolkit.TypeBuilder.Builders;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 using JNotNull = JetBrains.Annotations.NotNullAttribute;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 namespace BLToolkit.Reflection
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 public delegate object NullValueProvider(Type type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public delegate bool IsNullHandler (object obj);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 [DebuggerDisplay("Type = {Type}, OriginalType = {OriginalType}")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public abstract class TypeAccessor : ICollection<MemberAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 #if !SILVERLIGHT && !DATA
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 , ITypeDescriptionProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 #region Protected Emit Helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 protected MemberInfo GetMember(int memberType, string memberName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 const BindingFlags allInstaceMembers =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 MemberInfo mi;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 switch (memberType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 case 1: mi = Type.GetField (memberName, allInstaceMembers); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 case 2:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 mi =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 Type. GetProperty(memberName, allInstaceMembers) ??
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 OriginalType.GetProperty(memberName, allInstaceMembers);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 return mi;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 protected void AddMember(MemberAccessor member)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 if (member == null) throw new ArgumentNullException("member");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 _members.Add(member);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 _memberNames.Add(member.MemberInfo.Name, member);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 #region CreateInstance
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 [DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 public virtual object CreateInstance()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 "The '{0}' type must have public default or init constructor.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 OriginalType.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 [DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 public virtual object CreateInstance(InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 return CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 [DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 public object CreateInstanceEx()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 return _objectFactory != null?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 _objectFactory.CreateInstance(this, null): CreateInstance((InitContext)null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 [DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 public object CreateInstanceEx(InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 return _objectFactory != null? _objectFactory.CreateInstance(this, context): CreateInstance(context);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 #region ObjectFactory
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 private IObjectFactory _objectFactory;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 public IObjectFactory ObjectFactory
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 get { return _objectFactory; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 set { _objectFactory = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 #region Copy & AreEqual
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 internal static object CopyInternal(object source, object dest, TypeAccessor ta)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 #if !SILVERLIGHT && !DATA
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 var isDirty = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 var sourceEditable = source as IMemberwiseEditable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 var destEditable = dest as IMemberwiseEditable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 if (sourceEditable != null && destEditable != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 foreach (MemberAccessor ma in ta)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 ma.CloneValue(source, dest);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 if (sourceEditable.IsDirtyMember(null, ma.MemberInfo.Name, ref isDirty) && !isDirty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 destEditable.AcceptMemberChanges(null, ma.MemberInfo.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 foreach (MemberAccessor ma in ta)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 ma.CloneValue(source, dest);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 return dest;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 public static object Copy(object source, object dest)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 if (dest == null) throw new ArgumentNullException("dest");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 TypeAccessor ta;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 var sType = source.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 var dType = dest. GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 if (TypeHelper.IsSameOrParent(sType, dType)) ta = GetAccessor(sType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 else if (TypeHelper.IsSameOrParent(dType, sType)) ta = GetAccessor(dType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 throw new ArgumentException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 return CopyInternal(source, dest, ta);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 public static object Copy(object source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 var ta = GetAccessor(source.GetType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 return CopyInternal(source, ta.CreateInstanceEx(), ta);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 public static bool AreEqual(object obj1, object obj2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 if (ReferenceEquals(obj1, obj2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 if (obj1 == null || obj2 == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 TypeAccessor ta;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 var sType = obj1.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 var dType = obj2.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 if (TypeHelper.IsSameOrParent(sType, dType)) ta = GetAccessor(sType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 else if (TypeHelper.IsSameOrParent(dType, sType)) ta = GetAccessor(dType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 foreach (MemberAccessor ma in ta)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 if ((!Equals(ma.GetValue(obj1), ma.GetValue(obj2))))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 public static int GetHashCode(object obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 if (obj == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 throw new ArgumentNullException("obj");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 var hash = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 object value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 foreach (MemberAccessor ma in GetAccessor(obj.GetType()))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 value = ma.GetValue(obj);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 hash = ((hash << 5) + hash) ^ (value == null ? 0 : value.GetHashCode());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 return hash;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 #region Abstract Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 public abstract Type Type { get; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 public abstract Type OriginalType { get; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 #region Items
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 private readonly List<MemberAccessor> _members = new List<MemberAccessor>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 private readonly Dictionary<string,MemberAccessor> _memberNames = new Dictionary<string,MemberAccessor>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 public MemberAccessor this[string memberName]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 MemberAccessor ma;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 return _memberNames.TryGetValue(memberName, out ma) ? ma : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 public MemberAccessor this[int index]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 get { return _members[index]; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 public MemberAccessor this[NameOrIndexParameter nameOrIndex]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 return nameOrIndex.ByName ? _memberNames[nameOrIndex.Name] : _members[nameOrIndex.Index];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 #region Static Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 [Obsolete("Use TypeFactory.LoadTypes instead")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 public static bool LoadTypes
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 get { return TypeFactory.LoadTypes; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 set { TypeFactory.LoadTypes = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 private static readonly Dictionary<Type,TypeAccessor> _accessors = new Dictionary<Type,TypeAccessor>(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 public static TypeAccessor GetAccessor(Type originalType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 if (originalType == null) throw new ArgumentNullException("originalType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 lock (_accessors)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 TypeAccessor accessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 if (_accessors.TryGetValue(originalType, out accessor))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 return accessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 if (IsAssociatedType(originalType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 return _accessors[originalType];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 var instanceType = (IsClassBulderNeeded(originalType) ? null : originalType) ?? TypeFactory.GetType(originalType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 var accessorType = TypeFactory.GetType(originalType, originalType, new TypeAccessorBuilder(instanceType, originalType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 accessor = (TypeAccessor)Activator.CreateInstance(accessorType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 _accessors.Add(originalType, accessor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 if (originalType != instanceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 _accessors.Add(instanceType, accessor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 return accessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 public static TypeAccessor GetAccessor([JNotNull] object obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 if (obj == null) throw new ArgumentNullException("obj");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 return GetAccessor(obj.GetType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 public static TypeAccessor GetAccessor<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 return TypeAccessor<T>.Instance;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 private static bool IsClassBulderNeeded(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 if (type.IsAbstract && !type.IsSealed)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 if (!type.IsInterface)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 if (TypeHelper.GetDefaultConstructor(type) != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 if (TypeHelper.GetConstructor(type, typeof(InitContext)) != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 var attrs = TypeHelper.GetAttributes(type, typeof(AutoImplementInterfaceAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 if (attrs != null && attrs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 internal static bool IsInstanceBuildable(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 if (!type.IsInterface)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 lock (_accessors)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 if (_accessors.ContainsKey(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 if (IsAssociatedType(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 var attrs = TypeHelper.GetAttributes(type, typeof(AutoImplementInterfaceAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 return attrs != null && attrs.Length > 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 private static bool IsAssociatedType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 if (AssociatedTypeHandler != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 var child = AssociatedTypeHandler(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 if (child != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 AssociateType(type, child);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 public static object CreateInstance(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 return GetAccessor(type).CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 public static object CreateInstance(Type type, InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 return GetAccessor(type).CreateInstance(context);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 public static object CreateInstanceEx(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 return GetAccessor(type).CreateInstanceEx();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 public static object CreateInstanceEx(Type type, InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 return GetAccessor(type).CreateInstance(context);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 public static T CreateInstance<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 return TypeAccessor<T>.CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 public static T CreateInstance<T>(InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 return TypeAccessor<T>.CreateInstance(context);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 public static T CreateInstanceEx<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 return TypeAccessor<T>.CreateInstanceEx();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 public static T CreateInstanceEx<T>(InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 return TypeAccessor<T>.CreateInstance(context);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 public static TypeAccessor AssociateType(Type parent, Type child)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 if (!TypeHelper.IsSameOrParent(parent, child))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 throw new ArgumentException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 string.Format("'{0}' must be a base type of '{1}'", parent, child),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 "child");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 var accessor = GetAccessor(child);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 accessor = (TypeAccessor)Activator.CreateInstance(accessor.GetType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 lock (_accessors)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 _accessors.Add(parent, accessor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 return accessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 public delegate Type GetAssociatedType(Type parent);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 public static event GetAssociatedType AssociatedTypeHandler;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 #region GetNullValue
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 private static NullValueProvider _getNullValue = GetNullInternal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 public static NullValueProvider GetNullValue
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 get { return _getNullValue ?? (_getNullValue = GetNullInternal);}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 set { _getNullValue = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 private static object GetNullInternal(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 if (type.IsValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 return GetEnumNullValue(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 if (type.IsPrimitive)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 if (type == typeof(Int32)) return Common.Configuration.NullableValues.Int32;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 if (type == typeof(Double)) return Common.Configuration.NullableValues.Double;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 if (type == typeof(Int16)) return Common.Configuration.NullableValues.Int16;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 if (type == typeof(Boolean)) return Common.Configuration.NullableValues.Boolean;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 if (type == typeof(SByte)) return Common.Configuration.NullableValues.SByte;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 if (type == typeof(Int64)) return Common.Configuration.NullableValues.Int64;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 if (type == typeof(Byte)) return Common.Configuration.NullableValues.Byte;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 if (type == typeof(UInt16)) return Common.Configuration.NullableValues.UInt16;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 if (type == typeof(UInt32)) return Common.Configuration.NullableValues.UInt32;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 if (type == typeof(UInt64)) return Common.Configuration.NullableValues.UInt64;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 if (type == typeof(Single)) return Common.Configuration.NullableValues.Single;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 if (type == typeof(Char)) return Common.Configuration.NullableValues.Char;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 if (type == typeof(DateTime)) return Common.Configuration.NullableValues.DateTime;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 if (type == typeof(DateTimeOffset)) return Common.Configuration.NullableValues.DateTimeOffset;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 if (type == typeof(Decimal)) return Common.Configuration.NullableValues.Decimal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 if (type == typeof(Guid)) return Common.Configuration.NullableValues.Guid;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 if (type == typeof(SqlInt32)) return SqlInt32. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 if (type == typeof(SqlString)) return SqlString. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 if (type == typeof(SqlBoolean)) return SqlBoolean. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 if (type == typeof(SqlByte)) return SqlByte. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 if (type == typeof(SqlDateTime)) return SqlDateTime.Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 if (type == typeof(SqlDecimal)) return SqlDecimal. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 if (type == typeof(SqlDouble)) return SqlDouble. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 if (type == typeof(SqlGuid)) return SqlGuid. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 if (type == typeof(SqlInt16)) return SqlInt16. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 if (type == typeof(SqlInt64)) return SqlInt64. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 if (type == typeof(SqlMoney)) return SqlMoney. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 if (type == typeof(SqlSingle)) return SqlSingle. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 if (type == typeof(SqlBinary)) return SqlBinary. Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 if (type == typeof(String)) return Common.Configuration.NullableValues.String;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 if (type == typeof(DBNull)) return DBNull.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 if (type == typeof(Stream)) return Stream.Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 if (type == typeof(SqlXml)) return SqlXml.Null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 const FieldAttributes EnumField = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 static readonly Dictionary<Type,object> _nullValues = new Dictionary<Type,object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 static object GetEnumNullValue(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 object nullValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 lock (_nullValues)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 if (_nullValues.TryGetValue(type, out nullValue))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 return nullValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 var fields = type.GetFields();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 foreach (var fi in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 if ((fi.Attributes & EnumField) == EnumField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 var attrs = Attribute.GetCustomAttributes(fi, typeof(NullValueAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 if (attrs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 nullValue = Enum.Parse(type, fi.Name, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 lock (_nullValues)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 if (!_nullValues.ContainsKey(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 _nullValues.Add(type, nullValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 return nullValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 private static IsNullHandler _isNull = IsNullInternal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 public static IsNullHandler IsNull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 get { return _isNull ?? (_isNull = IsNullInternal); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 set { _isNull = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 private static bool IsNullInternal(object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 if (value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 var nullValue = GetNullValue(value.GetType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 return nullValue != null && value.Equals(nullValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 #region ICollection Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 void ICollection<MemberAccessor>.Add(MemberAccessor item)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 _members.Add(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 void ICollection<MemberAccessor>.Clear()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 _members.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 bool ICollection<MemberAccessor>.Contains(MemberAccessor item)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 return _members.Contains(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 void ICollection<MemberAccessor>.CopyTo(MemberAccessor[] array, int arrayIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 _members.CopyTo(array, arrayIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 bool ICollection<MemberAccessor>.Remove(MemberAccessor item)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 return _members.Remove(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 public int Count
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 get { return _members.Count; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 bool ICollection<MemberAccessor>.IsReadOnly
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 get { return ((ICollection<MemberAccessor>)_members).IsReadOnly; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 public int IndexOf(MemberAccessor ma)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 return _members.IndexOf(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 #region IEnumerable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 public IEnumerator GetEnumerator()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 return _members.GetEnumerator();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 #region IEnumerable<MemberAccessor> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597 IEnumerator<MemberAccessor> IEnumerable<MemberAccessor>.GetEnumerator()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599 foreach (MemberAccessor member in _members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600 yield return member;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 #region Write Object Info
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 public static void WriteDebug(object o)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610 Write(o, DebugWriteLine);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 private static void DebugWriteLine(string text)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 Debug.WriteLine(text);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 public static void WriteConsole(object o)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 Write(o, Console.WriteLine);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 [SuppressMessage("Microsoft.Performance", "CA1818:DoNotConcatenateStringsInsideLoops")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 private static string MapTypeName(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 if (type.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 if (type.GetGenericTypeDefinition() == typeof(Nullable<>))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 return string.Format("{0}?", MapTypeName(Nullable.GetUnderlyingType(type)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 var name = type.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633 var idx = name.IndexOf('`');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 if (idx >= 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 name = name.Substring(0, idx);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 name += "<";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 foreach (var t in type.GetGenericArguments())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641 name += MapTypeName(t) + ',';
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 if (name[name.Length - 1] == ',')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 name = name.Substring(0, name.Length - 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 name += ">";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648 return name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 if (type.IsPrimitive ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 type == typeof(string) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 type == typeof(object) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 type == typeof(decimal))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656 if (type == typeof(int)) return "int";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 if (type == typeof(bool)) return "bool";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658 if (type == typeof(short)) return "short";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 if (type == typeof(long)) return "long";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 if (type == typeof(ushort)) return "ushort";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661 if (type == typeof(uint)) return "uint";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662 if (type == typeof(ulong)) return "ulong";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 if (type == typeof(float)) return "float";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 return type.Name.ToLower();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668 return type.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671 public delegate void WriteLine(string text);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673 [SuppressMessage("Microsoft.Usage", "CA2241:ProvideCorrectArgumentsToFormattingMethods")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 public static void Write(object o, WriteLine writeLine)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676 if (o == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 writeLine("*** (null) ***");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 MemberAccessor ma;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 var ta = GetAccessor(o.GetType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 var nameLen = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686 var typeLen = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688 foreach (var de in ta._memberNames)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690 if (nameLen < de.Key.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691 nameLen = de.Key.Length;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693 ma = de.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 if (typeLen < MapTypeName(ma.Type).Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696 typeLen = MapTypeName(ma.Type).Length;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 var text = "*** " + o.GetType().FullName + ": ***";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701 writeLine(text);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703 var format = string.Format("{{0,-{0}}} {{1,-{1}}} : {{2}}", typeLen, nameLen);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705 foreach (var de in ta._memberNames)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707 ma = de.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 var value = ma.GetValue(o);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711 if (value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 value = "(null)";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713 else if (value is ICollection)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714 value = string.Format("(Count = {0})", ((ICollection)value).Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716 text = string.Format(format, MapTypeName(ma.Type), de.Key, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
717
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
718 writeLine(text);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
719 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
720
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
721 writeLine("***");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
722 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
723
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
724 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
725
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
726 #region TypeDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
727
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
728 #if !SILVERLIGHT && !DATA
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
729
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
730 #region CustomTypeDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
731
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
732 private static readonly Hashtable _descriptors = new Hashtable();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
733
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
734 public static ICustomTypeDescriptor GetCustomTypeDescriptor(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
735 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
736 var descriptor = (ICustomTypeDescriptor)_descriptors[type];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
737
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
738 if (descriptor == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
739 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
740 lock (_descriptors.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
741 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
742 descriptor = (ICustomTypeDescriptor)_descriptors[type];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
743
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
744 if (descriptor == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
745 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
746 descriptor = new CustomTypeDescriptorImpl(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
747
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
748 _descriptors.Add(type, descriptor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
749 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
750 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
751 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
752 return descriptor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
753 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
754
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
755 private ICustomTypeDescriptor _customTypeDescriptor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
756 public ICustomTypeDescriptor CustomTypeDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
757 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
758 get { return _customTypeDescriptor ?? (_customTypeDescriptor = GetCustomTypeDescriptor(OriginalType)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
759 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
760
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
761 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
762
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
763 #region Property Descriptors
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
764
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
765 private PropertyDescriptorCollection _propertyDescriptors;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
766 public PropertyDescriptorCollection PropertyDescriptors
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
767 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
768 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
769 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
770 if (_propertyDescriptors == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
771 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
772 if (TypeHelper.IsSameOrParent(typeof(ICustomTypeDescriptor), OriginalType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
773 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
774 var descriptor = CreateInstance() as ICustomTypeDescriptor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
775
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
776 if (descriptor != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
777 _propertyDescriptors = descriptor.GetProperties();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
778 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
779
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
780 if (_propertyDescriptors == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
781 _propertyDescriptors = CreatePropertyDescriptors();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
782 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
783
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
784 return _propertyDescriptors;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
785 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
786 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
787
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
788 public PropertyDescriptorCollection CreatePropertyDescriptors()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
789 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
790 if (Data.DbManager.TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
791 Data.DbManager.WriteTraceLine(OriginalType.FullName, "CreatePropertyDescriptors");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
792
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
793 var pd = new PropertyDescriptor[Count];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
794
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
795 var i = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
796 foreach (MemberAccessor ma in _members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
797 pd[i++] = ma.PropertyDescriptor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
798
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
799 return new PropertyDescriptorCollection(pd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
800 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
801
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
802 public PropertyDescriptorCollection CreateExtendedPropertyDescriptors(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
803 Type objectViewType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
804 IsNullHandler isNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
805 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
806 // This is definitely wrong.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
807 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
808 //if (isNull == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
809 // isNull = _isNull;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
810
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
811 var pdc = CreatePropertyDescriptors();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
812
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
813 if (objectViewType != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
814 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
815 var viewAccessor = GetAccessor(objectViewType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
816 var objectView = (IObjectView)viewAccessor.CreateInstanceEx();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
817 var list = new List<PropertyDescriptor>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
818
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
819 var viewpdc = viewAccessor.PropertyDescriptors;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
820
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
821 foreach (PropertyDescriptor pd in viewpdc)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
822 list.Add(new ObjectViewPropertyDescriptor(pd, objectView));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
823
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
824 foreach (PropertyDescriptor pd in pdc)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
825 if (viewpdc.Find(pd.Name, false) == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
826 list.Add(pd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
827
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
828 pdc = new PropertyDescriptorCollection(list.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
829 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
830
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
831 pdc = pdc.Sort(new PropertyDescriptorComparer());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
832
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
833 pdc = GetExtendedProperties(pdc, OriginalType, String.Empty, Type.EmptyTypes, new PropertyDescriptor[0], isNull);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
834
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
835 return pdc;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
836 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
837
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
838 private static PropertyDescriptorCollection GetExtendedProperties(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
839 PropertyDescriptorCollection pdc,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
840 Type itemType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
841 string propertyPrefix,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
842 Type[] parentTypes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
843 PropertyDescriptor[] parentAccessors,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
844 IsNullHandler isNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
845 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
846 var list = new ArrayList(pdc.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
847 var objects = new ArrayList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
848 var isDataRow = itemType.IsSubclassOf(typeof(DataRow));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
849
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
850 foreach (PropertyDescriptor p in pdc)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
851 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
852 var propertyType = p.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
853
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
854 if (p.Attributes.Matches(BindableAttribute.No) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
855 //propertyType == typeof(Type) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
856 isDataRow && p.Name == "ItemArray")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
857 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
858
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
859 var isList = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
860 var explicitlyBound = p.Attributes.Contains(BindableAttribute.Yes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
861 var pd = p;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
862
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
863 if (propertyType.GetInterface("IList") != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
864 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
865 //if (!explicitlyBound)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
866 // continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
867
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
868 isList = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
869 pd = new ListPropertyDescriptor(pd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
870 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
871
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
872 if (!isList &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
873 !propertyType.IsValueType &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
874 !propertyType.IsArray &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
875 (!propertyType.FullName.StartsWith("System.") || explicitlyBound
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
876 || propertyType.IsGenericType) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
877 propertyType != typeof(Type) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
878 propertyType != typeof(string) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
879 propertyType != typeof(object) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
880 Array.IndexOf(parentTypes, propertyType) == -1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
881 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
882 var childParentTypes = new Type[parentTypes.Length + 1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
883
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
884 parentTypes.CopyTo(childParentTypes, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
885 childParentTypes[parentTypes.Length] = itemType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
886
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
887 var childParentAccessors = new PropertyDescriptor[parentAccessors.Length + 1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
888
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
889 parentAccessors.CopyTo(childParentAccessors, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
890 childParentAccessors[parentAccessors.Length] = pd;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
891
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
892 var pdch = GetAccessor(propertyType).PropertyDescriptors;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
893
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
894 pdch = pdch.Sort(new PropertyDescriptorComparer());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
895 pdch = GetExtendedProperties(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
896 pdch,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
897 propertyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
898 propertyPrefix + pd.Name + "+",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
899 childParentTypes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
900 childParentAccessors,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
901 isNull);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
902
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
903 objects.AddRange(pdch);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
904 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
905 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
906 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
907 if (propertyPrefix.Length != 0 || isNull != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
908 pd = new StandardPropertyDescriptor(pd, propertyPrefix, parentAccessors, isNull);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
909
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
910 list.Add(pd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
911 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
912 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
913
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
914 list.AddRange(objects);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
915
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
916 return new PropertyDescriptorCollection(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
917 (PropertyDescriptor[])list.ToArray(typeof(PropertyDescriptor)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
918 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
919
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
920 #region PropertyDescriptorComparer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
921
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
922 class PropertyDescriptorComparer : IComparer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
923 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
924 public int Compare(object x, object y)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
925 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
926 return String.Compare(((PropertyDescriptor)x).Name, ((PropertyDescriptor)y).Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
927 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
928 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
929
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
930 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
931
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
932 #region ListPropertyDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
933
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
934 class ListPropertyDescriptor : PropertyDescriptorWrapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
935 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
936 public ListPropertyDescriptor(PropertyDescriptor descriptor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
937 : base(descriptor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
938 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
939 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
940
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
941 public override object GetValue(object component)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
942 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
943 var value = base.GetValue(component);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
944
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
945 if (value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
946 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
947
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
948 if (value is IBindingList && value is ITypedList)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
949 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
950
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
951 return EditableArrayList.Adapter((IList)value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
952 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
953 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
954
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
955 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
956
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
957 #region StandardPropertyDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
958
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
959 class StandardPropertyDescriptor : PropertyDescriptorWrapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
960 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
961 protected readonly PropertyDescriptor _descriptor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
962 protected readonly IsNullHandler _isNull;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
963
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
964 protected readonly string _prefixedName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
965 protected readonly PropertyDescriptor[] _chainAccessors;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
966
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
967 public StandardPropertyDescriptor(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
968 PropertyDescriptor pd,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
969 string namePrefix,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
970 PropertyDescriptor[] chainAccessors,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
971 IsNullHandler isNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
972 : base(pd)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
973 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
974 _descriptor = pd;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
975 _isNull = isNull;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
976 _prefixedName = namePrefix + pd.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
977 _chainAccessors = chainAccessors;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
978 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
979
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
980 protected object GetNestedComponent(object component)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
981 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
982 for (var i = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
983 i < _chainAccessors.Length && component != null && !(component is DBNull);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
984 i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
985 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
986 component = _chainAccessors[i].GetValue(component);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
987 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
988
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
989 return component;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
990 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
991
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
992 public override void SetValue(object component, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
993 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
994 component = GetNestedComponent(component);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
995
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
996 if (component != null && !(component is DBNull))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
997 _descriptor.SetValue(component, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
998 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
999
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1000 public override object GetValue(object component)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1001 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1002 component = GetNestedComponent(component);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1003
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1004 return CheckNull(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1005 component != null && !(component is DBNull)? _descriptor.GetValue(component): null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1006 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1007
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1008 public override string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1009 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1010 get { return _prefixedName; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1011 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1012
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1013 protected object CheckNull(object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1014 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1015 if (_isNull != null && _isNull(value))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1016 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1017 switch (Common.Configuration.CheckNullReturnIfNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1018 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1019 case Common.Configuration.NullEquivalent.DBNull:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1020 return DBNull.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1021 case Common.Configuration.NullEquivalent.Null:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1022 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1023 case Common.Configuration.NullEquivalent.Value:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1024 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1025 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1026
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1027 return DBNull.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1028 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1029
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1030 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1031 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1032 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1033
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1034 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1035
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1036 #region objectViewPropertyDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1037
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1038 class ObjectViewPropertyDescriptor : PropertyDescriptorWrapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1039 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1040 public ObjectViewPropertyDescriptor(PropertyDescriptor pd, IObjectView objectView)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1041 : base(pd)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1042 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1043 _objectView = objectView;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1044 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1045
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1046 private readonly IObjectView _objectView;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1047
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1048 public override object GetValue(object component)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1049 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1050 _objectView.Object = component;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1051
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1052 return base.GetValue(_objectView);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1053 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1054
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1055 public override void SetValue(object component, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1056 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1057 _objectView.Object = component;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1058
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1059 base.SetValue(_objectView, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1060 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1061 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1062
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1063 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1064
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1065 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1066
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1067 #region ITypeDescriptionProvider Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1068
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1069 string ITypeDescriptionProvider.ClassName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1070 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1071 get { return OriginalType.Name; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1072 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1073
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1074 string ITypeDescriptionProvider.ComponentName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1075 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1076 get { return OriginalType.Name; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1077 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1078
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1079 EventDescriptor ITypeDescriptionProvider.GetEvent(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1080 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1081 return new CustomEventDescriptor(OriginalType.GetEvent(name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1082 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1083
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1084 PropertyDescriptor ITypeDescriptionProvider.GetProperty(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1085 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1086 var ma = this[name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1087 return ma != null ? ma.PropertyDescriptor : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1088 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1089
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1090 AttributeCollection ITypeDescriptionProvider.GetAttributes()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1091 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1092 var attributesAsObj = new TypeHelper(OriginalType).GetAttributes();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1093 var attributes = new Attribute[attributesAsObj.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1094
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1095 for (var i = 0; i < attributesAsObj.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1096 attributes[i] = attributesAsObj[i] as Attribute;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1097
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1098 return new AttributeCollection(attributes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1099 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1101 EventDescriptorCollection ITypeDescriptionProvider.GetEvents()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1103 var ei = OriginalType.GetEvents();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1104 var ed = new EventDescriptor[ei.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1106 for (var i = 0; i < ei.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1107 ed[i] = new CustomEventDescriptor(ei[i]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1109 return new EventDescriptorCollection(ed);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1110 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1112 PropertyDescriptorCollection ITypeDescriptionProvider.GetProperties()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1113 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1114 return CreatePropertyDescriptors();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1115 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1116
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1117 #region CustomEventDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1119 class CustomEventDescriptor : EventDescriptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1120 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1121 public CustomEventDescriptor(EventInfo eventInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1122 : base(eventInfo.Name, null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1123 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1124 _eventInfo = eventInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1125 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1127 private readonly EventInfo _eventInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1129 public override void AddEventHandler(object component, Delegate value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1130 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1131 _eventInfo.AddEventHandler(component, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1134 public override void RemoveEventHandler(object component, Delegate value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1135 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1136 _eventInfo.RemoveEventHandler(component, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1137 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1139 public override Type ComponentType { get { return _eventInfo.DeclaringType; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1140 public override Type EventType { get { return _eventInfo.EventHandlerType; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1141 public override bool IsMulticast { get { return _eventInfo.IsMulticast; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1142 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1144 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1146 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1147
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1148 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1150 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1152 }