Skip to content

Commit 528e4e3

Browse files
committed
cache the interfaces
1 parent 7df4381 commit 528e4e3

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

src/AutoMapper/Internal/TypeDetails.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,26 @@ void CheckPrePostfixes(MemberInfo member)
7777
_nameToMember.TryAdd(memberName, member);
7878
}
7979
}
80-
IEnumerable<MemberInfo> GetNoArgExtensionMethods(IEnumerable<MethodInfo> sourceExtensionMethodSearch) =>
81-
(
82-
from method in sourceExtensionMethodSearch
83-
where !method.ContainsGenericParameters && method.FirstParameterType().IsAssignableFrom(Type)
84-
select (MemberInfo) method
85-
).Concat(
86-
from method in sourceExtensionMethodSearch
87-
let firstParameterType = method.FirstParameterType()
88-
where firstParameterType.IsInterface && firstParameterType.ContainsGenericParameters
89-
let genericInterface = Type.GetGenericInterface(firstParameterType.GetGenericTypeDefinition())
90-
where genericInterface != null
91-
select new GenericMethod(method, genericInterface)
92-
);
80+
IEnumerable<MemberInfo> GetNoArgExtensionMethods(IEnumerable<MethodInfo> sourceExtensionMethodSearch)
81+
{
82+
var extensionMethods =
83+
from method in sourceExtensionMethodSearch
84+
where !method.ContainsGenericParameters && method.FirstParameterType().IsAssignableFrom(Type)
85+
select (MemberInfo)method;
86+
var genericInterfaces = Type.GetInterfaces().Where(t => t.IsGenericType);
87+
if (Type.IsInterface && Type.IsGenericType)
88+
{
89+
genericInterfaces = genericInterfaces.Prepend(Type);
90+
}
91+
var definitions = genericInterfaces.GroupBy(t => t.GetGenericTypeDefinition()).ToDictionary(g => g.Key, g => g.First());
92+
return extensionMethods.Concat(
93+
from method in sourceExtensionMethodSearch
94+
let firstParameterType = method.FirstParameterType()
95+
where firstParameterType.IsInterface && firstParameterType.ContainsGenericParameters
96+
let genericInterface = definitions.GetValueOrDefault(firstParameterType.GetGenericTypeDefinition())
97+
where genericInterface != null
98+
select new GenericMethod(method, genericInterface));
99+
}
93100
}
94101
class GenericMethod : MemberInfo
95102
{

0 commit comments

Comments
 (0)