public MethodGroup MakeGenericMethod(Type[] types) {
TypeList tl = new TypeList(types);
// check for cached method first...
MethodGroup mg;
if (_boundGenerics != null) {
lock (_boundGenerics) {
if (_boundGenerics.TryGetValue(tl, out mg)) {
return mg;
}
}
}
// Search for generic targets with the correct arity (number of type parameters).
// Compatible targets must be MethodInfos by definition (constructors never take
// type arguments).
List<MethodTracker> targets = new List<MethodTracker>(Methods.Count);
foreach (MethodTracker mt in Methods) {
MethodInfo mi = mt.Method;
if (mi.ContainsGenericParameters && mi.GetGenericArguments().Length == types.Length)
targets.Add((MethodTracker)MemberTracker.FromMemberInfo(mi.MakeGenericMethod(types)));
}
if (targets.Count == 0) {
return null;
}
// Build a new MethodGroup that will contain targets with bound type arguments & cache it.
mg = new MethodGroup(targets.ToArray());
EnsureBoundGenericDict();
lock (_boundGenerics) {
_boundGenerics[tl] = mg;
}
return mg;
}