26
26
/// References an entity by its type and name.
27
/// This class can be used to refer to fields, events, and parameterless properties.
27
/// This class can be used to refer to all members except for constructors and explicit interface implementations.
30
/// Resolving a DefaultMemberReference requires a context that provides enough information for resolving the declaring type reference
31
/// and the parameter types references.
30
34
public sealed class DefaultMemberReference : IMemberReference, ISupportsInterning
50
54
this.parameterTypes = parameterTypes ?? EmptyList<ITypeReference>.Instance;
57
public ITypeReference DeclaringTypeReference {
58
get { return typeReference; }
53
61
public IMember Resolve(ITypeResolveContext context)
55
63
IType type = typeReference.Resolve(context);
56
64
IEnumerable<IMember> members;
57
65
if (entityType == EntityType.Method) {
58
66
members = type.GetMethods(
59
m => m.Name == name && m.EntityType == EntityType.Method && m.TypeParameters.Count == typeParameterCount,
67
m => m.Name == name && m.EntityType == EntityType.Method
68
&& m.TypeParameters.Count == typeParameterCount && !m.IsExplicitInterfaceImplementation,
60
69
GetMemberOptions.IgnoreInheritedMembers);
62
71
members = type.GetMembers(
63
m => m.Name == name && m.EntityType == entityType,
72
m => m.Name == name && m.EntityType == entityType && !m.IsExplicitInterfaceImplementation,
64
73
GetMemberOptions.IgnoreInheritedMembers);
66
75
var resolvedParameterTypes = parameterTypes.Resolve(context);
67
76
foreach (IMember member in members) {
68
77
IParameterizedMember parameterizedMember = member as IParameterizedMember;
69
if (parameterTypes.Count == 0) {
70
if (parameterizedMember == null || parameterizedMember.Parameters.Count == 0)
78
if (parameterizedMember == null) {
79
if (parameterTypes.Count == 0)
72
81
} else if (parameterTypes.Count == parameterizedMember.Parameters.Count) {
73
82
bool signatureMatches = true;
74
83
for (int i = 0; i < parameterTypes.Count; i++) {
75
IType type1 = ParameterListComparer.Instance.NormalizeMethodTypeParameters(resolvedParameterTypes[i]);
76
IType type2 = ParameterListComparer.Instance.NormalizeMethodTypeParameters(parameterizedMember.Parameters[i].Type);
84
IType type1 = DummyTypeParameter.NormalizeAllTypeParameters(resolvedParameterTypes[i]);
85
IType type2 = DummyTypeParameter.NormalizeAllTypeParameters(parameterizedMember.Parameters[i].Type);
77
86
if (!type1.Equals(type2)) {
78
87
signatureMatches = false;