annotate Source/Reflection/TypeHelper.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
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.Diagnostics.CodeAnalysis;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.IO;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using System.Xml;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using System.Xml.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 namespace BLToolkit.Reflection
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 #if !SILVERLIGHT && !DATA
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 using EditableObjects;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 using DataAccess;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 using TypeBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 /// A wrapper around the <see cref="Type"/> class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 [System.Diagnostics.DebuggerDisplay("Type = {Type}")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 public class TypeHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 /// Initializes a new instance of the <see cref="TypeHelper"/> class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 /// <param name="type">The Type to wrap.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 public TypeHelper(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 Type = type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 /// Gets associated Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 public Type Type { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 /// Converts the supplied <see cref="Type"/> to a <see cref="TypeHelper"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 /// <param name="type">The Type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 /// <returns>A TypeHelper.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 public static implicit operator TypeHelper(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 return new TypeHelper(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 /// Converts the supplied <see cref="TypeHelper"/> to a <see cref="Type"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 /// <param name="typeHelper">The TypeHelper.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 /// <returns>A Type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 public static implicit operator Type(TypeHelper typeHelper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 if (typeHelper == null) throw new ArgumentNullException("typeHelper");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 return typeHelper.Type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 #region GetAttributes
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 /// Returns an array of custom attributes identified by <b>Type</b>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 /// <param name="attributeType">The type of attribute to search for.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 /// Only attributes that are assignable to this type are returned.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 /// <param name="inherit">Specifies whether to search this member's inheritance chain
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 /// to find the attributes.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 /// <returns>An array of custom attributes defined on this reflected member,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 /// or an array with zero (0) elements if no attributes are defined.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 public object[] GetCustomAttributes(Type attributeType, bool inherit)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 return Type.GetCustomAttributes(attributeType, inherit);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 /// Returns an array of custom attributes identified by <b>Type</b>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 /// including attribute's inheritance chain.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 /// <param name="attributeType">The type of attribute to search for.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 /// Only attributes that are assignable to this type are returned.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 /// <returns>An array of custom attributes defined on this reflected member,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 /// or an array with zero (0) elements if no attributes are defined.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 public object[] GetCustomAttributes(Type attributeType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 return Type.GetCustomAttributes(attributeType, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 /// Returns an array of all of the custom attributes.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 /// <param name="inherit">Specifies whether to search this member's inheritance chain
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 /// to find the attributes.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 /// <returns>An array of custom attributes defined on this reflected member,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 /// or an array with zero (0) elements if no attributes are defined.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 public object[] GetCustomAttributes(bool inherit)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 return Type.GetCustomAttributes(inherit);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 /// Returns an array of all of the custom attributes including attributes' inheritance chain.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 /// <returns>An array of custom attributes defined on this reflected member,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 /// or an array with zero (0) elements if no attributes are defined.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 public object[] GetCustomAttributes()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 return Type.GetCustomAttributes(true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 /// Returns an array of all custom attributes identified by <b>Type</b> including type's
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 /// inheritance chain.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 /// <param name="attributeType">The type of attribute to search for.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 /// Only attributes that are assignable to this type are returned.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 /// <returns>An array of custom attributes defined on this reflected member,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 /// or an array with zero (0) elements if no attributes are defined.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 public object[] GetAttributes(Type attributeType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 return GetAttributes(Type, attributeType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 /// Returns an array of all custom attributes including type's inheritance chain.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 /// <returns>An array of custom attributes defined on this reflected member,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 /// or an array with zero (0) elements if no attributes are defined.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 public object[] GetAttributes()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 return GetAttributesInternal();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 #region Attributes cache
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 object[] GetAttributesInternal()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 lock (_typeAttributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 var key = Type.FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 object[] attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 if (!_typeAttributes.TryGetValue(key, out attrs))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 var list = new List<object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 GetAttributesInternal(list, Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 _typeAttributes.Add(key, attrs = list.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 return attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 static readonly Dictionary<Type,object[]> _typeAttributesTopInternal = new Dictionary<Type,object[]>(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 static void GetAttributesInternal(List<object> list, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 object[] attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 if (_typeAttributesTopInternal.TryGetValue(type, out attrs))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 list.AddRange(attrs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 GetAttributesTreeInternal(list, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 _typeAttributesTopInternal.Add(type, list.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 static readonly Dictionary<Type,object[]> _typeAttributesInternal = new Dictionary<Type,object[]>(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 static void GetAttributesTreeInternal(List<object> list, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 object[] attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 if (!_typeAttributesInternal.TryGetValue(type, out attrs))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 _typeAttributesInternal.Add(type, attrs = type.GetCustomAttributes(false));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 if (Common.Configuration.FilterOutBaseEqualAttributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 foreach (var t in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 if (!list.Contains(t))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 list.Add(t);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 list.AddRange(attrs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 if (type.IsInterface)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 // Reflection returns interfaces for the whole inheritance chain.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 // So, we are going to get some hemorrhoid here to restore the inheritance sequence.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 var interfaces = type.GetInterfaces();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 var nBaseInterfaces = type.BaseType != null? type.BaseType.GetInterfaces().Length: 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 for (var i = 0; i < interfaces.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 var intf = interfaces[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 if (i < nBaseInterfaces)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 var getAttr = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 foreach (var mi in type.GetInterfaceMap(intf).TargetMethods)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 // Check if the interface is reimplemented.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 if (mi.DeclaringType == type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 getAttr = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 if (getAttr == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 GetAttributesTreeInternal(list, intf);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 if (type.BaseType != null && type.BaseType != typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 GetAttributesTreeInternal(list, type.BaseType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 static readonly Dictionary<string,object[]> _typeAttributes = new Dictionary<string, object[]>(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 /// Returns an array of custom attributes applied to a type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 /// <param name="type">A type instance.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 /// <param name="attributeType">The type of attribute to search for.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 /// Only attributes that are assignable to this type are returned.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 /// <returns>An array of custom attributes applied to this type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 /// or an array with zero (0) elements if no attributes have been applied.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 public static object[] GetAttributes(Type type, Type attributeType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 if (attributeType == null) throw new ArgumentNullException("attributeType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 lock (_typeAttributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 var key = type.FullName + "#" + attributeType.FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 object[] attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 if (!_typeAttributes.TryGetValue(key, out attrs))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 var list = new List<object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 GetAttributesInternal(list, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 for (var i = 0; i < list.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 if (attributeType.IsInstanceOfType(list[i]) == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 list.RemoveAt(i--);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 _typeAttributes.Add(key, attrs = list.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 return attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 /// Retrieves a custom attribute applied to a type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 /// <param name="type">A type instance.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 /// <param name="attributeType">The type of attribute to search for.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 /// Only attributes that are assignable to this type are returned.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 /// <returns>A reference to the first custom attribute of type <paramref name="attributeType"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 /// that is applied to element, or null if there is no such attribute.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 public static Attribute GetFirstAttribute(Type type, Type attributeType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 var attrs = new TypeHelper(type).GetAttributes(attributeType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 return attrs.Length > 0? (Attribute)attrs[0]: null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 /// Retrieves a custom attribute applied to a type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 /// <param name="type">A type instance.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 /// <typeparam name="T">The type of attribute to search for.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 /// Only attributes that are assignable to this type are returned.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 /// <returns>A reference to the first custom attribute of type attributeType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 /// that is applied to element, or null if there is no such attribute.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 public static T GetFirstAttribute<T>(Type type) where T : Attribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 var attrs = new TypeHelper(type).GetAttributes(typeof(T));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 return attrs.Length > 0? (T)attrs[0]: null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 #region Property Wrappers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 /// Gets the fully qualified name of the Type, including the namespace of the Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 public string FullName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 get { return Type.FullName; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 /// Gets the name of the Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 public string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 get { return Type.Name; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 /// Gets a value indicating whether the Type is abstract and must be overridden.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 public bool IsAbstract
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 get { return Type.IsAbstract; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 /// Gets a value indicating whether the System.Type is an array.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 public bool IsArray
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 get { return Type.IsArray; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 /// Gets a value indicating whether the Type is a value type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 public bool IsValueType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 get { return Type.IsValueType; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 /// Gets a value indicating whether the Type is a class; that is, not a value type or interface.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 public bool IsClass
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 get { return Type.IsClass; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 /// Gets a value indicating whether the System.Type is an interface; that is, not a class or a value type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 public bool IsInterface
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 get { return Type.IsInterface; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 /// Indicates whether the Type is serializable.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 public bool IsSerializable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 #if SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 return Type.IsSerializable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 #region GetMethods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 /// Returns all the methods of the current Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 /// <returns>An array of <see cref="MethodInfo"/> objects representing all methods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 /// defined for the current Type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 public MethodInfo[] GetMethods()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 return Type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 /// Returns all the public methods of the current Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 /// <returns>An array of <see cref="MethodInfo"/> objects representing all the public methods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 /// defined for the current Type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 public MethodInfo[] GetPublicMethods()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 return Type.GetMethods(BindingFlags.Instance | BindingFlags.Public);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 /// Searches for the methods defined for the current Type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 /// using the specified binding constraints.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 /// <returns>An array of <see cref="MethodInfo"/> objects representing all methods defined
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 /// for the current Type that match the specified binding constraints.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 public MethodInfo[] GetMethods(BindingFlags flags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 return Type.GetMethods(flags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 /// Returns all the generic or non-generic methods of the current Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 /// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 /// <returns>An array of <see cref="MethodInfo"/> objects representing all methods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 /// defined for the current Type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 public MethodInfo[] GetMethods(bool generic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 return GetMethods(Type, generic, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 /// Returns all the public and non-generic methods of the current Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 /// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 /// <returns>An array of <see cref="MethodInfo"/> objects representing all the public methods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 /// defined for the current Type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 public MethodInfo[] GetPublicMethods(bool generic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 return GetMethods(Type, generic, BindingFlags.Instance | BindingFlags.Public);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 /// Searches for the generic methods defined for the current Type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 /// using the specified binding constraints.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 /// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 /// <returns>An array of <see cref="MethodInfo"/> objects representing all methods defined
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 /// for the current Type that match the specified binding constraints.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 public MethodInfo[] GetMethods(bool generic, BindingFlags flags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 return GetMethods(Type, generic, flags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 #region GetMethod
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 /// Searches for the specified instance method (public or non-public), using the specified name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 /// that matches the specified name, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 public MethodInfo GetMethod(string methodName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 return Type.GetMethod(methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 /// Searches for the specified public instance method, using the specified name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 /// that matches the specified name, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 public MethodInfo GetPublicMethod(string methodName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 return Type.GetMethod(methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 BindingFlags.Instance | BindingFlags.Public);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 /// Searches for the specified method, using the specified name and binding flags.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 public MethodInfo GetMethod(string methodName, BindingFlags flags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 return Type.GetMethod(methodName, flags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 /// Searches for the specified public instance method, using the specified name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 public MethodInfo GetPublicMethod(string methodName, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 return Type.GetMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 BindingFlags.Instance | BindingFlags.Public,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 types,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 /// Searches for the specified instance method (public or non-public),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 /// using the specified name and argument types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 public MethodInfo GetMethod(string methodName, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 return Type.GetMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 types,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 /// Searches for the specified method, using the specified name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 /// binding flags and argument types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 public MethodInfo GetMethod(string methodName, BindingFlags flags, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 return Type.GetMethod(methodName, flags, null, types, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 /// Searches for the specified instance method (public or non-public), using the specified name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 /// <param name="generic">True to search only for a generic method, or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 /// False to search only for non-generic method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 public MethodInfo GetMethod(bool generic, string methodName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 return GetMethod(Type, generic, methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 /// Searches for the specified public instance method, using the specified name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 /// <param name="generic">True to search only for a generic method, or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 /// False to search only for non-generic method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 public MethodInfo GetPublicMethod(bool generic, string methodName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 return GetMethod(Type, generic, methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 BindingFlags.Instance | BindingFlags.Public);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 /// Searches for the specified method, using the specified name and binding flags.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 /// <param name="generic">True to search only for a generic method, or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 /// False to search only for non-generic method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 public MethodInfo GetMethod(bool generic, string methodName, BindingFlags flags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597 return GetMethod(Type, generic, methodName, flags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 /// Searches for the specified public instance method, using the specified name and argument types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604 /// <param name="generic">True to search only for a generic method, or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 /// False to search only for non-generic method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 public MethodInfo GetPublicMethod(bool generic, string methodName, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 return Type.GetMethod(methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 BindingFlags.Instance | BindingFlags.Public,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 generic ? GenericBinder.Generic : GenericBinder.NonGeneric,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 types, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 /// Searches for the specified instance method (public or non-public),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 /// using the specified name and argument types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 /// <param name="generic">True to search only for a generic method, or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 /// False to search only for non-generic method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633 public MethodInfo GetMethod(bool generic, string methodName, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 return Type.GetMethod(methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637 generic ? GenericBinder.Generic : GenericBinder.NonGeneric,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 types, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 /// Searches for the specified method using the specified name, binding flags and argument types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645 /// <param name="generic">True to search only for a generic method, or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 /// False to search only for non-generic method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 public MethodInfo GetMethod(bool generic, string methodName, BindingFlags flags, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 return Type.GetMethod(methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658 flags,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 generic ? GenericBinder.Generic : GenericBinder.NonGeneric,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 types, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 #region GetFields
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668 /// Returns all the public fields of the current Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 /// <returns>An array of <see cref="FieldInfo"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671 /// all the public fields defined for the current Type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 public FieldInfo[] GetFields()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 return Type.GetFields();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 /// Searches for the fields of the current Type, using the specified binding constraints.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 /// <param name="bindingFlags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 /// <returns>An array of <see cref="FieldInfo"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683 /// all fields of the current Type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 /// that match the specified binding constraints.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 public FieldInfo[] GetFields(BindingFlags bindingFlags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687 return Type.GetFields(bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691 /// Searches for the public field with the specified name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693 /// <param name="name">The String containing the name of the public field to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694 /// <returns>A <see cref="PropertyInfo"/> object representing the public field with the specified name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 /// if found; otherwise, a null reference.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696 public FieldInfo GetField(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698 return Type.GetField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704 #region GetProperties
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707 /// Returns all the public properties of the current Type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 /// <returns>An array of <see cref="PropertyInfo"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710 /// all public properties of the current Type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711 public PropertyInfo[] GetProperties()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713 return Type.GetProperties();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
717 /// Searches for the properties of the current Type, using the specified binding constraints.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
718 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
719 /// <param name="bindingFlags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
720 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
721 /// <returns>An array of <see cref="PropertyInfo"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
722 /// all properties of the current Type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
723 /// that match the specified binding constraints.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
724 public PropertyInfo[] GetProperties(BindingFlags bindingFlags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
725 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
726 return Type.GetProperties(bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
727 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
728
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
729 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
730 /// Searches for the public property with the specified name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
731 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
732 /// <param name="name">The String containing the name of the public property to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
733 /// <returns>A <see cref="PropertyInfo"/> object representing the public property with the specified name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
734 /// if found; otherwise, a null reference.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
735 public PropertyInfo GetProperty(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
736 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
737 return Type.GetProperty(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
738 name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
739 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
740
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
741 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
742
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
743 #region GetInterfaces
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
744
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
745 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
746 private Type[] _interfaces;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
747
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
748 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
749 /// Gets all the interfaces implemented or inherited by the current <see cref="Type"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
750 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
751 /// <returns>An array of Type objects representing all the interfaces implemented or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
752 /// inherited by the current Type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
753 /// if found; otherwise, an empty array.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
754 public Type[] GetInterfaces()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
755 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
756 if (_interfaces == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
757 _interfaces = _type.GetInterfaces();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
758
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
759 return _interfaces;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
760 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
761
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
762 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
763 /// Gets a specific interface implemented or inherited by the current <see cref="Type"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
764 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
765 /// <param name="interfaceType">The type of the interface to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
766 /// <returns>A Type object representing the interface of the specified type, if found;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
767 /// otherwise, a null reference (Nothing in Visual Basic).</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
768 public Type GetInterface(Type interfaceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
769 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
770 foreach (Type intf in GetInterfaces())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
771 if (intf == interfaceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
772 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
773
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
774 _type.IsSubclassOf(interfaceType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
775
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
776 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
777 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
778 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
779
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
780 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
781 /// Returns an interface mapping for the current <see cref="Type"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
782 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
783 /// <param name="interfaceType">The <see cref="System.Type"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
784 /// of the interface of which to retrieve a mapping.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
785 /// <returns>An <see cref="InterfaceMapping"/> object representing the interface
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
786 /// mapping for <paramref name="interfaceType"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
787 public InterfaceMapping GetInterfaceMap(Type interfaceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
788 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
789 return Type.GetInterfaceMap(interfaceType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
790 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
791
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
792 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
793
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
794 #region GetConstructor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
795
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
796 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
797 /// Searches for a public instance constructor whose parameters match
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
798 /// the types in the specified array.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
799 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
800 /// <param name="types">An array of Type objects representing the number,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
801 /// order, and type of the parameters for the constructor to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
802 /// <returns>A <see cref="ConstructorInfo"/> object representing the
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
803 /// public instance constructor whose parameters match the types in
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
804 /// the parameter type array, if found; otherwise, a null reference.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
805 public ConstructorInfo GetPublicConstructor(params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
806 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
807 return Type.GetConstructor(types);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
808 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
809
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
810 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
811 /// Searches for an instance constructor (public or non-public) whose
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
812 /// parameters match the types in the specified array.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
813 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
814 /// <param name="parameterType">Type object representing type of the
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
815 /// parameter for the constructor to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
816 /// <returns>A <see cref="ConstructorInfo"/> object representing the constructor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
817 /// whose parameters match the types in the parameter type array, if found;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
818 /// otherwise, a null reference.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
819 public ConstructorInfo GetConstructor(Type parameterType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
820 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
821 return GetConstructor(Type, parameterType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
822 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
823
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
824 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
825 /// Searches for an instance constructor (public or non-public) whose
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
826 /// parameters match the types in the specified array.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
827 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
828 /// <param name="type">An instance of <see cref="System.Type"/> to search constructor for.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
829 /// <param name="types">An array of Type objects representing the number,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
830 /// order, and type of the parameters for the constructor to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
831 /// <returns>A <see cref="ConstructorInfo"/> object representing the constructor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
832 /// whose parameters match the types in the parameter type array, if found;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
833 /// otherwise, a null reference.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
834 public static ConstructorInfo GetConstructor(Type type, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
835 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
836 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
837
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
838 return type.GetConstructor(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
839 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
840 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
841 types,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
842 null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
843 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
844
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
845 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
846 /// Searches for a public default constructor.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
847 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
848 /// <returns>A <see cref="ConstructorInfo"/> object representing the constructor.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
849 public ConstructorInfo GetPublicDefaultConstructor()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
850 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
851 return Type.GetConstructor(Type.EmptyTypes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
852 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
853
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
854 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
855 /// Searches for a default constructor.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
856 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
857 /// <returns>A <see cref="ConstructorInfo"/> object representing the constructor.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
858 public ConstructorInfo GetDefaultConstructor()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
859 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
860 return GetDefaultConstructor(Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
861 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
862
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
863 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
864 /// Searches for a default constructor.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
865 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
866 /// <param name="type">An instance of <see cref="System.Type"/> to search constructor for.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
867 /// <returns>A <see cref="ConstructorInfo"/> object representing the constructor.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
868 public static ConstructorInfo GetDefaultConstructor(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
869 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
870 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
871
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
872 return type.GetConstructor(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
873 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
874 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
875 Type.EmptyTypes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
876 null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
877 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
878
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
879 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
880 /// Searches for a public constructors.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
881 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
882 /// <returns>An array of <see cref="ConstructorInfo"/> objects
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
883 /// representing all the type public constructors, if found; otherwise, an empty array.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
884 public ConstructorInfo[] GetPublicConstructors()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
885 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
886 return Type.GetConstructors();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
887 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
888
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
889 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
890 /// Searches for all constructors (except type constructors).
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
891 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
892 /// <returns>An array of <see cref="ConstructorInfo"/> objects
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
893 /// representing all the type constructors, if found; otherwise, an empty array.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
894 public ConstructorInfo[] GetConstructors()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
895 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
896 return Type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
897 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
898
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
899 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
900
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
901 #region Static Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
902
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
903 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
904 /// Gets a value indicating whether a type (or type's element type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
905 /// instance can be null in the underlying data store.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
906 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
907 /// <param name="type">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
908 /// <returns> True, if the type parameter is a closed generic nullable type; otherwise, False.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
909 /// <remarks>Arrays of Nullable types are treated as Nullable types.</remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
910 public static bool IsNullable(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
911 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
912 while (type.IsArray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
913 type = type.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
914
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
915 return (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
916 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
917
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
918 public static bool IsNullableType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
919 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
920 return (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
921 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
922
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
923 public static bool IsNullableEnum(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
924 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
925 return IsNullableType(type) && type.GetGenericArguments()[0].IsEnum;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
926 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
927
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
928 public static bool IsEnumOrNullableEnum(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
929 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
930 return type.IsEnum || IsNullableEnum(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
931 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
932
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
933 public static Type ToNullable(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
934 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
935 if (!IsNullable(type) && type.IsValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
936 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
937 var nullable = typeof(Nullable<>);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
938 var typeArguments = nullable.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
939 if (typeArguments != null && typeArguments.Length == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
940 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
941 type = nullable.MakeGenericType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
942 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
943 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
944 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
945 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
946
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
947 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
948 /// Returns the underlying type argument of the specified type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
949 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
950 /// <param name="type">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
951 /// <returns><list>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
952 /// <item>The type argument of the type parameter,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
953 /// if the type parameter is a closed generic nullable type.</item>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
954 /// <item>The underlying Type if the type parameter is an enum type.</item>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
955 /// <item>Otherwise, the type itself.</item>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
956 /// </list>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
957 /// </returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
958 public static Type GetUnderlyingType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
959 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
960 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
961
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
962 if (IsNullableType(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
963 type = type.GetGenericArguments()[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
964
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
965 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
966 type = Enum.GetUnderlyingType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
967
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
968 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
969 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
970
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
971 public static Type UnwrapNullableType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
972 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
973 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
974
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
975 return IsNullableType(type) ? type.GetGenericArguments()[0] : type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
976 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
977
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
978 public static IEnumerable<Type> GetDefiningTypes(Type child, MemberInfo member)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
979 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
980 if (member.MemberType == MemberTypes.Property)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
981 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
982 var prop = (PropertyInfo)member;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
983 member = prop.GetGetMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
984 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
985
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
986 foreach (var inf in child.GetInterfaces())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
987 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
988 var pm = child.GetInterfaceMap(inf);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
989
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
990 for (var i = 0; i < pm.TargetMethods.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
991 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
992 var method = pm.TargetMethods[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
993
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
994 if (method == member || (method.DeclaringType == member.DeclaringType && method.Name == member.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
995 yield return inf;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
996 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
997 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
998
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
999 yield return member.DeclaringType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1000 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1001
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1002 public static bool IsAbstractClass(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1003 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1004 return type.IsClass && type.IsAbstract;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1005 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1006
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1007 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1008 /// Determines whether the specified types are considered equal.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1009 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1010 /// <param name="parent">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1011 /// <param name="child">A type possible derived from the <c>parent</c> type</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1012 /// <returns>True, when an object instance of the type <c>child</c>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1013 /// can be used as an object of the type <c>parent</c>; otherwise, false.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1014 /// <remarks>Note that nullable types does not have a parent-child relation to it's underlying type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1015 /// For example, the 'int?' type (nullable int) and the 'int' type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1016 /// aren't a parent and it's child.</remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1017 public static bool IsSameOrParent([JetBrains.Annotations.NotNull] Type parent, [JetBrains.Annotations.NotNull] Type child)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1018 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1019 if (parent == null) throw new ArgumentNullException("parent");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1020 if (child == null) throw new ArgumentNullException("child");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1021
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1022 if (parent == child ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1023 child.IsEnum && Enum.GetUnderlyingType(child) == parent ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1024 child.IsSubclassOf(parent))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1025 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1026 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1027 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1028
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1029 if (parent.IsGenericTypeDefinition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1030 for (var t = child; t != typeof(object) && t != null; t = t.BaseType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1031 if (t.IsGenericType && t.GetGenericTypeDefinition() == parent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1032 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1033
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1034 if (parent.IsInterface)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1035 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1036 var interfaces = child.GetInterfaces();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1037
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1038 foreach (var t in interfaces)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1039 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1040 if (parent.IsGenericTypeDefinition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1041 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1042 if (t.IsGenericType && t.GetGenericTypeDefinition() == parent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1043 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1044 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1045 else if (t == parent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1046 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1047 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1048 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1049
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1050 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1051 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1052
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1053 public static Type GetGenericType([JetBrains.Annotations.NotNull] Type genericType, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1054 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1055 if (genericType == null) throw new ArgumentNullException("genericType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1056
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1057 while (type != null && type != typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1058 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1059 if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1060 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1061
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1062 if (genericType.IsInterface)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1063 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1064 foreach (var interfaceType in type.GetInterfaces())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1065 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1066 var gType = GetGenericType(genericType, interfaceType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1067
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1068 if (gType != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1069 return gType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1070 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1071 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1072
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1073 type = type.BaseType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1074 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1075
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1076 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1077 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1078
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1079 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1080 /// Searches for the method defined for a <see cref="System.Type"/>,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1081 /// using the specified name and binding flags.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1082 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1083 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1084 /// <param name="generic">True to search only for a generic method, or
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1085 /// False to search only for non-generic method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1086 /// <param name="type">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1087 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1088 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1089 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1090 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1091 public static MethodInfo GetMethod([JetBrains.Annotations.NotNull] Type type, bool generic, string methodName, BindingFlags flags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1092 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1093 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1094
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1095 foreach (var method in type.GetMethods(flags))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1096 if (method.IsGenericMethodDefinition == generic && method.Name == methodName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1097 return method;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1098
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1099 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1100 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1102 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1103 /// Searches for the methods defined for a <see cref="System.Type"/>,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1104 /// using the specified name and binding flags.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1105 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1106 /// <param name="type">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1107 /// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1108 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1109 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1110 /// <returns>An array of <see cref="MethodInfo"/> objects representing all methods defined
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1111 /// for the current Type that match the specified binding constraints.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1112 public static MethodInfo[] GetMethods(Type type, bool generic, BindingFlags flags)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1113 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1114 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1116 return type.GetMethods(flags).Where(method => method.IsGenericMethodDefinition == generic).ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1119 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1120 /// Searches for the method defined for a <see cref="System.Type"/>,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1121 /// using the specified name and binding flags.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1122 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1123 /// <param name="type">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1124 /// <param name="methodName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1125 /// <param name="requiredParametersCount">Number of required (non optional)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1126 /// parameter types.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1127 /// <param name="bindingFlags">A bitmask comprised of one or more <see cref="BindingFlags"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1128 /// that specify how the search is conducted.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1129 /// <param name="parameterTypes">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1130 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1131 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1132 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1133 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1134 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1135 public static MethodInfo GetMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1136 Type type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1137 string methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1138 BindingFlags bindingFlags,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1139 int requiredParametersCount,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1140 params Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1141 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1142 while (parameterTypes.Length >= requiredParametersCount)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1143 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1144 var method = type.GetMethod(methodName, parameterTypes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1146 if (null != method)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1147 return method;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1149 if (parameterTypes.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1150 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1152 Array.Resize(ref parameterTypes, parameterTypes.Length - 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1153 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1155 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1156 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1158 [SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1159 public static object[] GetPropertyParameters(PropertyInfo propertyInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1160 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1161 if (propertyInfo == null) throw new ArgumentNullException("propertyInfo");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1163 var attrs = propertyInfo.GetCustomAttributes(typeof(ParameterAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1164
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1165 if (attrs != null && attrs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1166 return ((ParameterAttribute)attrs[0]).Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1168 attrs = propertyInfo.GetCustomAttributes(typeof(InstanceTypeAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1169
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1170 if (attrs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1171 return ((InstanceTypeAttribute)attrs[0]).Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1173 attrs = new TypeHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1174 propertyInfo.DeclaringType).GetAttributes(typeof(GlobalInstanceTypeAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1176 foreach (GlobalInstanceTypeAttribute attr in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1177 if (IsSameOrParent(attr.PropertyType, propertyInfo.PropertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1178 // if (attr.PropertyType == propertyInfo.PropertyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1179 return attr.Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1181 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1182 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1184 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1185 /// Searches for the property defined for a <see cref="System.Type"/>,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1186 /// using the specified name and parameter types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1187 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1188 /// <param name="type">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1189 /// <param name="propertyName">The String containing the name of the method to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1190 /// <param name="types">An array of Type objects representing the number,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1191 /// order, and type of the parameters for the constructor to get.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1192 /// <param name="returnType">The property return <see cref="System.Type"/>. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1193 /// <returns>A <see cref="MethodInfo"/> object representing the method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1194 /// that matches the specified requirements, if found; otherwise, null.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1195 public static PropertyInfo GetPropertyInfo(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1196 Type type, string propertyName, Type returnType, Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1197 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1198 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1200 return type.GetProperty(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1201 propertyName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1202 BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1203 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1204 returnType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1205 types,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1206 null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1207 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1209 ///<summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1210 /// Gets the Type of a list item.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1211 ///</summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1212 /// <param name="list">A <see cref="System.Object"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1213 ///<returns>The Type instance that represents the exact runtime type of a list item.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1214 public static Type GetListItemType(object list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1215 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1216 var typeOfObject = typeof(object);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1218 if (list == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1219 return typeOfObject;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1220
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1221 #if !SILVERLIGHT && !DATA
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1223 if (list is EditableArrayList)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1224 return ((EditableArrayList)list).ItemType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1226 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1228 if (list is Array)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1229 return list.GetType().GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1231 var type = list.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1233 // object[] attrs = type.GetCustomAttributes(typeof(DefaultMemberAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1234 // string itemMemberName = (attrs.Length == 0)? "Item": ((DefaultMemberAttribute)attrs[0]).MemberName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1236 if (list is IList
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1237 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1238 || list is ITypedList || list is IListSource
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1239 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1240 )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1241 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1242 PropertyInfo last = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1244 foreach (var pi in type.GetProperties())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1246 if (pi.GetIndexParameters().Length > 0 && pi.PropertyType != typeOfObject)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1247 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1248 if (pi.Name == "Item")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1249 return pi.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1251 last = pi;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1252 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1253 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1255 if (last != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1256 return last.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1257 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1259 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1260 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1261 if (list is IList)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1262 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1263 foreach (var o in (IList)list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1264 if (o != null && o.GetType() != typeOfObject)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1265 return o.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1266 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1267 else if (list is IEnumerable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1268 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1269 foreach (var o in (IEnumerable)list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1270 if (o != null && o.GetType() != typeOfObject)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1271 return o.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1272 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1273 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1274 catch
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1275 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1276 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1278 return typeOfObject;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1279 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1281 ///<summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1282 /// Gets the Type of a list item.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1283 ///</summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1284 /// <param name="listType">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1285 ///<returns>The Type instance that represents the exact runtime type of a list item.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1286 public static Type GetListItemType(Type listType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1287 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1288 if (listType.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1289 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1290 var elementTypes = GetGenericArguments(listType, typeof(IList));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1292 if (elementTypes != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1293 return elementTypes[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1294 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1296 if (IsSameOrParent(typeof(IList), listType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1297 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1298 || IsSameOrParent(typeof(ITypedList), listType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1299 || IsSameOrParent(typeof(IListSource), listType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1300 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1301 )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1302 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1303 var elementType = listType.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1305 if (elementType != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1306 return elementType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1308 PropertyInfo last = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1309
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1310 foreach (var pi in listType.GetProperties())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1311 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1312 if (pi.GetIndexParameters().Length > 0 && pi.PropertyType != typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1313 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1314 if (pi.Name == "Item")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1315 return pi.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1316
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1317 last = pi;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1318 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1319 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1321 if (last != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1322 return last.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1325 return typeof(object);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1326 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1327
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1328 public static Type GetElementType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1329 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1330 if (type == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1331 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1333 if (type == typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1334 return type.HasElementType ? type.GetElementType(): null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1336 if (type.IsArray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1337 return type.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1339 if (type.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1340 foreach (var aType in type.GetGenericArguments())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1341 if (typeof(IEnumerable<>).MakeGenericType(new[] { aType }).IsAssignableFrom(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1342 return aType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1343
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1344 var interfaces = type.GetInterfaces();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1345
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1346 if (interfaces != null && interfaces.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1347 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1348 foreach (var iType in interfaces)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1349 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1350 var eType = GetElementType(iType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1352 if (eType != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1353 return eType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1354 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1355 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1357 return GetElementType(type.BaseType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1358 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1359
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1360 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1361 /// Gets a value indicating whether a type can be used as a db primitive.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1362 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1363 /// <param name="type">A <see cref="System.Type"/> instance. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1364 /// <returns> True, if the type parameter is a primitive type; otherwise, False.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1365 /// <remarks><see cref="System.String"/>. <see cref="Stream"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1366 /// <see cref="XmlReader"/>. <see cref="XmlDocument"/>. are specially handled by the library
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1367 /// and, therefore, can be treated as scalar types.</remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1368 public static bool IsScalar(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1369 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1370 while (type.IsArray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1371 type = type.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1373 return type.IsValueType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1374 || type == typeof(string)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1375 || type == typeof(System.Data.Linq.Binary)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1376 || type == typeof(Stream)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1377 || type == typeof(XmlReader)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1378 || type.GetCustomAttributes(typeof(ScalarAttribute),true).Any() // If the type is a UDT pass it as is
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1379 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1380 || type == typeof(XmlDocument)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1381 || type == typeof(XElement)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1382 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1383 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1384 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1386 ///<summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1387 /// Returns an array of Type objects that represent the type arguments
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1388 /// of a generic type or the type parameters of a generic type definition.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1389 ///</summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1390 /// <param name="type">A <see cref="System.Type"/> instance.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1391 ///<param name="baseType">Non generic base type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1392 ///<returns>An array of Type objects that represent the type arguments
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1393 /// of a generic type. Returns an empty array if the current type is not a generic type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1394 public static Type[] GetGenericArguments(Type type, Type baseType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1395 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1396 var baseTypeName = baseType.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1397
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1398 for (var t = type; t != typeof(object) && t != null; t = t.BaseType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1399 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1400 if (t.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1401 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1402 if (baseType.IsGenericTypeDefinition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1403 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1404 if (t.GetGenericTypeDefinition() == baseType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1405 return t.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1406 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1407 else if (baseTypeName == null || t.Name.Split('`')[0] == baseTypeName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1408 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1409 return t.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1410 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1411 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1412 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1413
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1414 foreach (var t in type.GetInterfaces())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1415 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1416 if (t.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1417 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1418 if (baseType.IsGenericTypeDefinition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1419 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1420 if (t.GetGenericTypeDefinition() == baseType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1421 return t.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1422 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1423 else if (baseTypeName == null || t.Name.Split('`')[0] == baseTypeName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1424 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1425 return t.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1426 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1427 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1428 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1430 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1431 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1432
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1433 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1434 /// Substitutes the elements of an array of types for the type parameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1435 /// of the current generic type definition and returns a Type object
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1436 /// representing the resulting constructed type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1437 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1438 /// <param name="type">A <see cref="System.Type"/> instance.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1439 /// <param name="typeArguments">An array of types to be substituted for
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1440 /// the type parameters of the current generic type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1441 /// <returns>A Type representing the constructed type formed by substituting
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1442 /// the elements of <paramref name="typeArguments"/> for the type parameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1443 /// of the current generic type.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1444 /// <seealso cref="System.Type.MakeGenericType"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1445 public static Type TranslateGenericParameters(Type type, Type[] typeArguments)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1446 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1447 // 'T paramName' case
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1448 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1449 if (type.IsGenericParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1450 return typeArguments[type.GenericParameterPosition];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1451
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1452 // 'List<T> paramName' or something like that.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1453 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1454 if (type.IsGenericType && type.ContainsGenericParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1455 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1456 var genArgs = type.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1457
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1458 for (var i = 0; i < genArgs.Length; ++i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1459 genArgs[i] = TranslateGenericParameters(genArgs[i], typeArguments);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1460
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1461 return type.GetGenericTypeDefinition().MakeGenericType(genArgs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1462 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1463
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1464 // Non-generic type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1465 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1466 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1467 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1468
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1469 public static bool CompareParameterTypes(Type goal, Type probe)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1470 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1471 if (goal == probe)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1472 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1473
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1474 if (goal.IsGenericParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1475 return CheckConstraints(goal, probe);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1476 if (goal.IsGenericType && probe.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1477 return CompareGenericTypes(goal, probe);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1478
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1479 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1480 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1481
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1482 public static bool CheckConstraints(Type goal, Type probe)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1483 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1484 var constraints = goal.GetGenericParameterConstraints();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1485
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1486 for (var i = 0; i < constraints.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1487 if (!constraints[i].IsAssignableFrom(probe))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1488 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1490 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1491 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1492
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1493 public static bool CompareGenericTypes(Type goal, Type probe)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1494 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1495 var genArgs = goal.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1496 var specArgs = probe.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1497 var match = (genArgs.Length == specArgs.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1498
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1499 for (var i = 0; match && i < genArgs.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1500 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1501 if (genArgs[i] == specArgs[i])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1502 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1503
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1504 if (genArgs[i].IsGenericParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1505 match = CheckConstraints(genArgs[i], specArgs[i]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1506 else if (genArgs[i].IsGenericType && specArgs[i].IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1507 match = CompareGenericTypes(genArgs[i], specArgs[i]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1508 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1509 match = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1510 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1511
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1512 return match;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1513 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1514
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1515 public static PropertyInfo GetPropertyByMethod(MethodInfo method)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1516 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1517 if (method != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1518 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1519 var type = method.DeclaringType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1520 var attr = BindingFlags.NonPublic | BindingFlags.Public | (method.IsStatic ? BindingFlags.Static : BindingFlags.Instance);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1521
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1522 foreach (var info in type.GetProperties(attr))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1523 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1524 if (info.CanRead && method == info.GetGetMethod(true))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1525 return info;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1526
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1527 if (info.CanWrite && method == info.GetSetMethod(true))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1528 return info;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1529 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1530 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1531
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1532 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1533 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1534
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1535 public static Type GetMemberType(MemberInfo memberInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1536 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1537 switch (memberInfo.MemberType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1538 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1539 case MemberTypes.Property : return ((PropertyInfo) memberInfo).PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1540 case MemberTypes.Field : return ((FieldInfo) memberInfo).FieldType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1541 case MemberTypes.Method : return ((MethodInfo) memberInfo).ReturnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1542 case MemberTypes.Constructor : return ((ConstructorInfo)memberInfo).DeclaringType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1543 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1544
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1545 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1546 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1547
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1548 public static bool IsFloatType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1549 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1550 if (IsNullableType(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1551 type = type.GetGenericArguments()[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1552
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1553 switch (Type.GetTypeCode(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1554 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1555 case TypeCode.Single :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1556 case TypeCode.Double :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1557 case TypeCode.Decimal : return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1558 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1559
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1560 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1561 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1562
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1563 public static bool IsIntegerType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1564 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1565 if (IsNullableType(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1566 type = type.GetGenericArguments()[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1567
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1568 switch (Type.GetTypeCode(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1569 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1570 case TypeCode.SByte :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1571 case TypeCode.Byte :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1572 case TypeCode.Int16 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1573 case TypeCode.UInt16 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1574 case TypeCode.Int32 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1575 case TypeCode.UInt32 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1576 case TypeCode.Int64 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1577 case TypeCode.UInt64 : return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1578 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1579
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1580 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1581 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1582
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1583 public static bool IsNullableValueMember(MemberInfo member)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1584 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1585 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1586 member.Name == "Value" &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1587 member.DeclaringType.IsGenericType &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1588 member.DeclaringType.GetGenericTypeDefinition() == typeof(Nullable<>);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1589 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1590
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1591 public static bool IsNullableHasValueMember(MemberInfo member)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1592 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1593 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1594 member.Name == "HasValue" &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1595 member.DeclaringType.IsGenericType &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1596 member.DeclaringType.GetGenericTypeDefinition() == typeof(Nullable<>);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1597 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1598
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1599 public static bool Equals(MemberInfo member1, MemberInfo member2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1600 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1601 return Equals(member1, member2, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1602 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1603
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1604 public static bool Equals(MemberInfo member1, MemberInfo member2, Type declaringType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1605 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1606 if (ReferenceEquals(member1, member2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1607 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1608
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1609 if (member1 == null || member2 == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1610 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1611
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1612 if (member1.Name == member2.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1613 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1614 if (member1.DeclaringType == member2.DeclaringType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1615 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1616
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1617 if (member1 is PropertyInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1618 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1619 var isSubclass =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1620 IsSameOrParent(member1.DeclaringType, member2.DeclaringType) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1621 IsSameOrParent(member2.DeclaringType, member1.DeclaringType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1622
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1623 if (isSubclass)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1624 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1625
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1626 if (declaringType != null && member2.DeclaringType.IsInterface)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1627 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1628 var getter1 = ((PropertyInfo)member1).GetGetMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1629 var getter2 = ((PropertyInfo)member2).GetGetMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1630
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1631 var map = declaringType.GetInterfaceMap(member2.DeclaringType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1632
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1633 for (var i = 0; i < map.InterfaceMethods.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1634 if (getter2.Name == map.InterfaceMethods[i].Name && getter2.DeclaringType == map.InterfaceMethods[i].DeclaringType &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1635 getter1.Name == map.TargetMethods [i].Name && getter1.DeclaringType == map.TargetMethods [i].DeclaringType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1636 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1637 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1638 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1639 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1640
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1641 if (member2.DeclaringType.IsInterface && member1.Name.EndsWith(member2.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1642 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1643 if (member1 is PropertyInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1644 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1645 var isSubclass = member2.DeclaringType.IsAssignableFrom(member1.DeclaringType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1646
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1647 if (isSubclass)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1648 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1649 var getter1 = ((PropertyInfo)member1).GetGetMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1650 var getter2 = ((PropertyInfo)member2).GetGetMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1651
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1652 var map = member1.DeclaringType.GetInterfaceMap(member2.DeclaringType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1653
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1654 for (var i = 0; i < map.InterfaceMethods.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1655 if ((getter2 == null || (getter2.Name == map.InterfaceMethods[i].Name && getter2.DeclaringType == map.InterfaceMethods[i].DeclaringType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1656 &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1657 (getter1 == null || (getter1.Name == map.InterfaceMethods[i].Name && getter1.DeclaringType == map.InterfaceMethods[i].DeclaringType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1658 )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1659 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1660 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1661 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1662 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1663 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1664 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1665
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1666 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1667 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1668
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1669 interface IGetDefaultValueHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1670 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1671 object GetDefaultValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1672 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1673
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1674 class GetDefaultValueHelper<T> : IGetDefaultValueHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1675 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1676 public object GetDefaultValue()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1677 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1678 return default(T);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1679 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1680 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1682 public static object GetDefaultValue(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1683 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1684 var dtype = typeof(GetDefaultValueHelper<>).MakeGenericType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1685 var helper = (IGetDefaultValueHelper)Activator.CreateInstance(dtype);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1686
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1687 return helper.GetDefaultValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1688 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1689
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1690 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1691 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1692 }