1
ļ»æ// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
3
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4
// software and associated documentation files (the "Software"), to deal in the Software
5
// without restriction, including without limitation the rights to use, copy, modify, merge,
6
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7
// to whom the Software is furnished to do so, subject to the following conditions:
9
// The above copyright notice and this permission notice shall be included in all copies or
10
// substantial portions of the Software.
12
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17
// DEALINGS IN THE SOFTWARE.
20
using System.Collections.Generic;
21
using System.Collections.ObjectModel;
23
using ICSharpCode.NRefactory.Documentation;
24
using ICSharpCode.NRefactory.Utils;
26
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
29
/// Default implementation of <see cref="ITypeDefinition"/>.
31
public class DefaultResolvedTypeDefinition : ITypeDefinition
33
readonly ITypeResolveContext parentContext;
34
readonly IUnresolvedTypeDefinition[] parts;
35
Accessibility accessibility = Accessibility.Internal;
36
bool isAbstract, isSealed, isShadowing;
37
bool isSynthetic = true; // true if all parts are synthetic
39
public DefaultResolvedTypeDefinition(ITypeResolveContext parentContext, params IUnresolvedTypeDefinition[] parts)
41
if (parentContext == null || parentContext.CurrentAssembly == null)
42
throw new ArgumentException("Parent context does not specify any assembly", "parentContext");
43
if (parts == null || parts.Length == 0)
44
throw new ArgumentException("No parts were specified", "parts");
45
this.parentContext = parentContext;
48
foreach (IUnresolvedTypeDefinition part in parts) {
49
isAbstract |= part.IsAbstract;
50
isSealed |= part.IsSealed;
51
isShadowing |= part.IsShadowing;
52
isSynthetic &= part.IsSynthetic; // true if all parts are synthetic
54
// internal is the default, so use another part's accessibility until we find a non-internal accessibility
55
if (accessibility == Accessibility.Internal)
56
accessibility = part.Accessibility;
60
IList<ITypeParameter> typeParameters;
62
public IList<ITypeParameter> TypeParameters {
64
var result = LazyInit.VolatileRead(ref this.typeParameters);
68
ITypeResolveContext contextForTypeParameters = parts[0].CreateResolveContext(parentContext);
69
contextForTypeParameters = contextForTypeParameters.WithCurrentTypeDefinition(this);
70
if (parentContext.CurrentTypeDefinition == null || parentContext.CurrentTypeDefinition.TypeParameterCount == 0) {
71
result = parts[0].TypeParameters.CreateResolvedTypeParameters(contextForTypeParameters);
73
// This is a nested class inside a generic class; copy type parameters from outer class if we can:
74
var outerClass = parentContext.CurrentTypeDefinition;
75
ITypeParameter[] typeParameters = new ITypeParameter[parts[0].TypeParameters.Count];
76
for (int i = 0; i < typeParameters.Length; i++) {
77
var unresolvedTP = parts[0].TypeParameters[i];
78
if (i < outerClass.TypeParameterCount && outerClass.TypeParameters[i].Name == unresolvedTP.Name)
79
typeParameters[i] = outerClass.TypeParameters[i];
81
typeParameters[i] = unresolvedTP.CreateResolvedTypeParameter(contextForTypeParameters);
83
result = Array.AsReadOnly(typeParameters);
85
return LazyInit.GetOrSet(ref this.typeParameters, result);
89
IList<IAttribute> attributes;
91
public IList<IAttribute> Attributes {
93
var result = LazyInit.VolatileRead(ref this.attributes);
97
result = new List<IAttribute>();
98
foreach (IUnresolvedTypeDefinition part in parts) {
99
ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext);
100
foreach (var attr in part.Attributes) {
101
result.Add(attr.CreateResolvedAttribute(parentContextForPart));
104
if (result.Count == 0)
105
result = EmptyList<IAttribute>.Instance;
106
return LazyInit.GetOrSet(ref this.attributes, result);
110
public IList<IUnresolvedTypeDefinition> Parts {
111
get { return parts; }
114
public EntityType EntityType {
115
get { return parts[0].EntityType; }
118
public virtual TypeKind Kind {
119
get { return parts[0].Kind; }
123
IList<ITypeDefinition> nestedTypes;
125
public IList<ITypeDefinition> NestedTypes {
127
IList<ITypeDefinition> result = LazyInit.VolatileRead(ref this.nestedTypes);
128
if (result != null) {
133
from nestedTypeRef in part.NestedTypes
134
group nestedTypeRef by nestedTypeRef.Name into g
135
select new DefaultResolvedTypeDefinition(new SimpleTypeResolveContext(this), g.ToArray())
136
).ToList<ITypeDefinition>().AsReadOnly();
137
return LazyInit.GetOrSet(ref this.nestedTypes, result);
144
sealed class MemberList : IList<IMember>
146
internal readonly ITypeResolveContext[] contextPerMember;
147
internal readonly IUnresolvedMember[] unresolvedMembers;
148
internal readonly IMember[] resolvedMembers;
149
internal readonly int NonPartialMemberCount;
151
public MemberList(List<ITypeResolveContext> contextPerMember, List<IUnresolvedMember> unresolvedNonPartialMembers, List<PartialMethodInfo> partialMethodInfos)
153
this.NonPartialMemberCount = unresolvedNonPartialMembers.Count;
154
this.contextPerMember = contextPerMember.ToArray();
155
this.unresolvedMembers = unresolvedNonPartialMembers.ToArray();
156
if (partialMethodInfos == null) {
157
this.resolvedMembers = new IMember[unresolvedNonPartialMembers.Count];
159
this.resolvedMembers = new IMember[unresolvedNonPartialMembers.Count + partialMethodInfos.Count];
160
for (int i = 0; i < partialMethodInfos.Count; i++) {
161
var info = partialMethodInfos[i];
162
int memberIndex = NonPartialMemberCount + i;
163
resolvedMembers[memberIndex] = DefaultResolvedMethod.CreateFromMultipleParts(
164
info.Parts.ToArray(), info.Contexts.ToArray (), false);
169
public IMember this[int index] {
171
IMember output = LazyInit.VolatileRead(ref resolvedMembers[index]);
172
if (output != null) {
175
return LazyInit.GetOrSet(ref resolvedMembers[index], unresolvedMembers[index].CreateResolved(contextPerMember[index]));
177
set { throw new NotSupportedException(); }
181
get { return resolvedMembers.Length; }
184
bool ICollection<IMember>.IsReadOnly {
188
public int IndexOf(IMember item)
190
for (int i = 0; i < this.Count; i++) {
191
if (this[i].Equals(item))
197
void IList<IMember>.Insert(int index, IMember item)
199
throw new NotSupportedException();
202
void IList<IMember>.RemoveAt(int index)
204
throw new NotSupportedException();
207
void ICollection<IMember>.Add(IMember item)
209
throw new NotSupportedException();
212
void ICollection<IMember>.Clear()
214
throw new NotSupportedException();
217
bool ICollection<IMember>.Contains(IMember item)
219
return IndexOf(item) >= 0;
222
void ICollection<IMember>.CopyTo(IMember[] array, int arrayIndex)
224
for (int i = 0; i < this.Count; i++) {
225
array[arrayIndex + i] = this[i];
229
bool ICollection<IMember>.Remove(IMember item)
231
throw new NotSupportedException();
234
public IEnumerator<IMember> GetEnumerator()
236
for (int i = 0; i < this.Count; i++) {
237
yield return this[i];
241
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
243
return GetEnumerator();
247
sealed class PartialMethodInfo
249
public readonly string Name;
250
public readonly int TypeParameterCount;
251
public readonly IList<IParameter> Parameters;
252
public readonly List<IUnresolvedMethod> Parts = new List<IUnresolvedMethod>();
253
public readonly List<ITypeResolveContext> Contexts = new List<ITypeResolveContext>();
255
public PartialMethodInfo(IUnresolvedMethod method, ITypeResolveContext context)
257
this.Name = method.Name;
258
this.TypeParameterCount = method.TypeParameters.Count;
259
this.Parameters = method.Parameters.CreateResolvedParameters(context);
260
this.Parts.Add(method);
261
this.Contexts.Add (context);
264
public void AddPart(IUnresolvedMethod method, ITypeResolveContext context)
266
if (method.IsPartialMethodImplementation) {
267
// make the implementation the primary part
268
this.Parts.Insert(0, method);
269
this.Contexts.Insert (0, context);
271
this.Parts.Add(method);
272
this.Contexts.Add (context);
276
public bool IsSameSignature(PartialMethodInfo other, StringComparer nameComparer)
278
return nameComparer.Equals(this.Name, other.Name)
279
&& this.TypeParameterCount == other.TypeParameterCount
280
&& ParameterListComparer.Instance.Equals(this.Parameters, other.Parameters);
284
MemberList memberList;
286
MemberList GetMemberList()
288
var result = LazyInit.VolatileRead(ref this.memberList);
289
if (result != null) {
292
List<IUnresolvedMember> unresolvedMembers = new List<IUnresolvedMember>();
293
List<ITypeResolveContext> contextPerMember = new List<ITypeResolveContext>();
294
List<PartialMethodInfo> partialMethodInfos = null;
295
bool addDefaultConstructorIfRequired = false;
296
foreach (IUnresolvedTypeDefinition part in parts) {
297
ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext);
298
ITypeResolveContext contextForPart = parentContextForPart.WithCurrentTypeDefinition(this);
299
foreach (var member in part.Members) {
300
IUnresolvedMethod method = member as IUnresolvedMethod;
301
if (method != null && (method.IsPartialMethodDeclaration || method.IsPartialMethodImplementation)) {
302
// Merge partial method declaration and implementation
303
if (partialMethodInfos == null)
304
partialMethodInfos = new List<PartialMethodInfo>();
305
PartialMethodInfo newInfo = new PartialMethodInfo(method, contextForPart);
306
PartialMethodInfo existingInfo = null;
307
foreach (var info in partialMethodInfos) {
308
if (newInfo.IsSameSignature(info, Compilation.NameComparer)) {
313
if (existingInfo != null) {
314
// Add the unresolved method to the PartialMethodInfo:
315
existingInfo.AddPart(method, contextForPart);
317
partialMethodInfos.Add(newInfo);
320
unresolvedMembers.Add(member);
321
contextPerMember.Add(contextForPart);
325
DefaultUnresolvedTypeDefinition dutd = part as DefaultUnresolvedTypeDefinition;
327
addDefaultConstructorIfRequired |= dutd.AddDefaultConstructorIfRequired;
330
if (addDefaultConstructorIfRequired) {
331
TypeKind kind = this.Kind;
332
if (kind == TypeKind.Class && !this.IsStatic && !unresolvedMembers.Any(m => m.EntityType == EntityType.Constructor && !m.IsStatic)
333
|| kind == TypeKind.Enum || kind == TypeKind.Struct)
335
contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this));
336
unresolvedMembers.Add(DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0]));
339
result = new MemberList(contextPerMember, unresolvedMembers, partialMethodInfos);
340
return LazyInit.GetOrSet(ref this.memberList, result);
343
public IList<IMember> Members {
344
get { return GetMemberList(); }
347
public IEnumerable<IField> Fields {
349
var members = GetMemberList();
350
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
351
if (members.unresolvedMembers[i].EntityType == EntityType.Field)
352
yield return (IField)members[i];
357
public IEnumerable<IMethod> Methods {
359
var members = GetMemberList();
360
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
361
if (members.unresolvedMembers[i] is IUnresolvedMethod)
362
yield return (IMethod)members[i];
364
for (int i = members.unresolvedMembers.Length; i < members.Count; i++) {
365
yield return (IMethod)members[i];
370
public IEnumerable<IProperty> Properties {
372
var members = GetMemberList();
373
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
374
switch (members.unresolvedMembers[i].EntityType) {
375
case EntityType.Property:
376
case EntityType.Indexer:
377
yield return (IProperty)members[i];
384
public IEnumerable<IEvent> Events {
386
var members = GetMemberList();
387
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
388
if (members.unresolvedMembers[i].EntityType == EntityType.Event)
389
yield return (IEvent)members[i];
395
volatile KnownTypeCode knownTypeCode = (KnownTypeCode)(-1);
397
public KnownTypeCode KnownTypeCode {
399
KnownTypeCode result = this.knownTypeCode;
400
if (result == (KnownTypeCode)(-1)) {
401
result = KnownTypeCode.None;
402
for (int i = 0; i < KnownTypeReference.KnownTypeCodeCount; i++) {
403
KnownTypeReference r = KnownTypeReference.Get((KnownTypeCode)i);
404
if (r != null && r.Resolve(parentContext) == this) {
405
result = (KnownTypeCode)i;
409
this.knownTypeCode = result;
415
volatile IType enumUnderlyingType;
417
public IType EnumUnderlyingType {
419
IType result = this.enumUnderlyingType;
420
if (result == null) {
421
if (this.Kind == TypeKind.Enum) {
422
result = CalculateEnumUnderlyingType();
424
result = SpecialType.UnknownType;
426
this.enumUnderlyingType = result;
432
IType CalculateEnumUnderlyingType()
434
foreach (var part in parts) {
435
var context = part.CreateResolveContext(parentContext).WithCurrentTypeDefinition(this);
436
foreach (var baseTypeRef in part.BaseTypes) {
437
IType type = baseTypeRef.Resolve(context);
438
if (type.Kind != TypeKind.Unknown)
442
return this.Compilation.FindType(KnownTypeCode.Int32);
445
volatile byte hasExtensionMethods; // 0 = unknown, 1 = true, 2 = false
447
public bool HasExtensionMethods {
449
byte val = this.hasExtensionMethods;
451
if (CalculateHasExtensionMethods())
455
this.hasExtensionMethods = val;
461
bool CalculateHasExtensionMethods()
463
bool noExtensionMethods = true;
464
foreach (var part in parts) {
465
// Return true if any part has extension methods
466
if (part.HasExtensionMethods == true)
468
if (part.HasExtensionMethods == null)
469
noExtensionMethods = false;
471
// Return false if all parts are known to have no extension methods
472
if (noExtensionMethods)
474
// If unsure, look at the resolved methods.
475
return Methods.Any(m => m.IsExtensionMethod);
478
public bool? IsReferenceType {
482
case TypeKind.Interface:
483
case TypeKind.Module:
484
case TypeKind.Delegate:
486
case TypeKind.Struct:
491
throw new InvalidOperationException("Invalid value for TypeKind");
496
public int TypeParameterCount {
497
get { return parts[0].TypeParameters.Count; }
500
#region DirectBaseTypes
501
IList<IType> directBaseTypes;
503
public IEnumerable<IType> DirectBaseTypes {
505
IList<IType> result = LazyInit.VolatileRead(ref this.directBaseTypes);
506
if (result != null) {
509
result = CalculateDirectBaseTypes();
510
return LazyInit.GetOrSet(ref this.directBaseTypes, result);
515
IList<IType> CalculateDirectBaseTypes()
517
List<IType> result = new List<IType>();
518
bool hasNonInterface = false;
519
if (this.Kind != TypeKind.Enum) {
520
foreach (var part in parts) {
521
var context = part.CreateResolveContext(parentContext).WithCurrentTypeDefinition(this);
522
foreach (var baseTypeRef in part.BaseTypes) {
523
IType baseType = baseTypeRef.Resolve(context);
524
if (!(baseType.Kind == TypeKind.Unknown || result.Contains(baseType))) {
525
result.Add(baseType);
526
if (baseType.Kind != TypeKind.Interface)
527
hasNonInterface = true;
532
if (!hasNonInterface && !(this.Name == "Object" && this.Namespace == "System" && this.TypeParameterCount == 0)) {
533
KnownTypeCode primitiveBaseType;
536
primitiveBaseType = KnownTypeCode.Enum;
538
case TypeKind.Struct:
540
primitiveBaseType = KnownTypeCode.ValueType;
542
case TypeKind.Delegate:
543
primitiveBaseType = KnownTypeCode.Delegate;
546
primitiveBaseType = KnownTypeCode.Object;
549
IType t = parentContext.Compilation.FindType(primitiveBaseType);
550
if (t.Kind != TypeKind.Unknown)
557
public string FullName {
558
get { return parts[0].FullName; }
562
get { return parts[0].Name; }
565
public string ReflectionName {
566
get { return parts[0].ReflectionName; }
569
public string Namespace {
570
get { return parts[0].Namespace; }
573
public DomRegion Region {
574
get { return parts[0].Region; }
577
public DomRegion BodyRegion {
578
get { return parts[0].BodyRegion; }
581
public ITypeDefinition DeclaringTypeDefinition {
582
get { return parentContext.CurrentTypeDefinition; }
585
public IType DeclaringType {
586
get { return parentContext.CurrentTypeDefinition; }
589
public IAssembly ParentAssembly {
590
get { return parentContext.CurrentAssembly; }
593
public virtual DocumentationComment Documentation {
595
foreach (var part in parts) {
596
var unresolvedProvider = part.ParsedFile as IUnresolvedDocumentationProvider;
597
if (unresolvedProvider != null) {
598
var doc = unresolvedProvider.GetDocumentation(part, this);
603
IDocumentationProvider provider = AbstractResolvedEntity.FindDocumentation(parentContext);
604
if (provider != null)
605
return provider.GetDocumentation(this);
611
public ICompilation Compilation {
612
get { return parentContext.Compilation; }
616
public bool IsStatic { get { return isAbstract && isSealed; } }
617
public bool IsAbstract { get { return isAbstract; } }
618
public bool IsSealed { get { return isSealed; } }
619
public bool IsShadowing { get { return isShadowing; } }
620
public bool IsSynthetic { get { return isSynthetic; } }
622
public Accessibility Accessibility {
623
get { return accessibility; }
626
bool IHasAccessibility.IsPrivate {
627
get { return accessibility == Accessibility.Private; }
630
bool IHasAccessibility.IsPublic {
631
get { return accessibility == Accessibility.Public; }
634
bool IHasAccessibility.IsProtected {
635
get { return accessibility == Accessibility.Protected; }
638
bool IHasAccessibility.IsInternal {
639
get { return accessibility == Accessibility.Internal; }
642
bool IHasAccessibility.IsProtectedOrInternal {
643
get { return accessibility == Accessibility.ProtectedOrInternal; }
646
bool IHasAccessibility.IsProtectedAndInternal {
647
get { return accessibility == Accessibility.ProtectedAndInternal; }
651
ITypeDefinition IType.GetDefinition()
656
IType IType.AcceptVisitor(TypeVisitor visitor)
658
return visitor.VisitTypeDefinition(this);
661
IType IType.VisitChildren(TypeVisitor visitor)
666
public ITypeReference ToTypeReference()
668
ITypeDefinition declTypeDef = this.DeclaringTypeDefinition;
669
if (declTypeDef != null) {
670
return new NestedTypeReference(declTypeDef.ToTypeReference(), this.Name, this.TypeParameterCount - declTypeDef.TypeParameterCount);
672
IAssembly asm = this.ParentAssembly;
673
IAssemblyReference asmRef;
675
asmRef = new DefaultAssemblyReference(asm.AssemblyName);
678
return new GetClassTypeReference(asmRef, this.Namespace, this.Name, this.TypeParameterCount);
682
public IEnumerable<IType> GetNestedTypes(Predicate<ITypeDefinition> filter = null, GetMemberOptions options = GetMemberOptions.None)
684
const GetMemberOptions opt = GetMemberOptions.IgnoreInheritedMembers | GetMemberOptions.ReturnMemberDefinitions;
685
if ((options & opt) == opt) {
687
return this.NestedTypes;
689
return GetNestedTypesImpl(filter);
691
return GetMembersHelper.GetNestedTypes(this, filter, options);
695
IEnumerable<IType> GetNestedTypesImpl(Predicate<ITypeDefinition> filter)
697
foreach (var nestedType in this.NestedTypes) {
698
if (filter(nestedType))
699
yield return nestedType;
703
public IEnumerable<IType> GetNestedTypes(IList<IType> typeArguments, Predicate<ITypeDefinition> filter = null, GetMemberOptions options = GetMemberOptions.None)
705
return GetMembersHelper.GetNestedTypes(this, typeArguments, filter, options);
709
IEnumerable<IMember> GetFilteredMembers(Predicate<IUnresolvedMember> filter)
711
var members = GetMemberList();
712
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
713
if (filter == null || filter(members.unresolvedMembers[i])) {
714
yield return members[i];
717
for (int i = members.unresolvedMembers.Length; i < members.Count; i++) {
718
var method = (IMethod)members[i];
720
foreach (var part in method.Parts) {
721
if (filter == null || filter(part)) {
731
IEnumerable<IMethod> GetFilteredMethods(Predicate<IUnresolvedMethod> filter)
733
var members = GetMemberList();
734
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
735
IUnresolvedMethod unresolved = members.unresolvedMembers[i] as IUnresolvedMethod;
736
if (unresolved != null && (filter == null || filter(unresolved))) {
737
yield return (IMethod)members[i];
740
for (int i = members.unresolvedMembers.Length; i < members.Count; i++) {
741
var method = (IMethod)members[i];
743
foreach (var part in method.Parts) {
744
if (filter == null || filter(part)) {
754
IEnumerable<TResolved> GetFilteredNonMethods<TUnresolved, TResolved>(Predicate<TUnresolved> filter) where TUnresolved : class, IUnresolvedMember where TResolved : class, IMember
756
var members = GetMemberList();
757
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
758
TUnresolved unresolved = members.unresolvedMembers[i] as TUnresolved;
759
if (unresolved != null && (filter == null || filter(unresolved))) {
760
yield return (TResolved)members[i];
765
public virtual IEnumerable<IMethod> GetMethods(Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.None)
767
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
768
return GetFilteredMethods(Utils.ExtensionMethods.And(m => !m.IsConstructor, filter));
770
return GetMembersHelper.GetMethods(this, filter, options);
774
public virtual IEnumerable<IMethod> GetMethods(IList<IType> typeArguments, Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.None)
776
return GetMembersHelper.GetMethods(this, typeArguments, filter, options);
779
public virtual IEnumerable<IMethod> GetConstructors(Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.IgnoreInheritedMembers)
781
if (ComHelper.IsComImport(this)) {
782
IType coClass = ComHelper.GetCoClass(this);
783
using (var busyLock = BusyManager.Enter(this)) {
784
if (busyLock.Success) {
785
return coClass.GetConstructors(filter, options)
786
.Select(m => new SpecializedMethod(m, TypeParameterSubstitution.Identity) { DeclaringType = this });
789
return EmptyList<IMethod>.Instance;
791
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
792
return GetFilteredMethods(Utils.ExtensionMethods.And(m => m.IsConstructor && !m.IsStatic, filter));
794
return GetMembersHelper.GetConstructors(this, filter, options);
798
public virtual IEnumerable<IProperty> GetProperties(Predicate<IUnresolvedProperty> filter = null, GetMemberOptions options = GetMemberOptions.None)
800
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
801
return GetFilteredNonMethods<IUnresolvedProperty, IProperty>(filter);
803
return GetMembersHelper.GetProperties(this, filter, options);
807
public virtual IEnumerable<IField> GetFields(Predicate<IUnresolvedField> filter = null, GetMemberOptions options = GetMemberOptions.None)
809
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
810
return GetFilteredNonMethods<IUnresolvedField, IField>(filter);
812
return GetMembersHelper.GetFields(this, filter, options);
816
public virtual IEnumerable<IEvent> GetEvents(Predicate<IUnresolvedEvent> filter = null, GetMemberOptions options = GetMemberOptions.None)
818
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
819
return GetFilteredNonMethods<IUnresolvedEvent, IEvent>(filter);
821
return GetMembersHelper.GetEvents(this, filter, options);
825
public virtual IEnumerable<IMember> GetMembers(Predicate<IUnresolvedMember> filter = null, GetMemberOptions options = GetMemberOptions.None)
827
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
828
return GetFilteredMembers(filter);
830
return GetMembersHelper.GetMembers(this, filter, options);
835
public bool Equals(IType other)
837
return this == other;
840
public override string ToString()
842
return this.ReflectionName;