public static MatcherInfo FromMatcherAndParamInfo(object matcherObject, ParameterInfo paramInfo, out MatcherInfo[] paramsMatchers) { var kind = MatcherKind.Unknown; var argType = typeof(void); var expressionString = "n/a"; paramsMatchers = null; ITypedMatcher typedMatcher; if (MockingUtil.TryGetAs(matcherObject, out typedMatcher)) { if (matcherObject.GetType() == typeof(ValueMatcher)) { kind = MatcherKind.Value; } else if (matcherObject.GetType() == typeof(TypeMatcher)) { kind = MatcherKind.Type; } else if (matcherObject.GetType() == typeof(StringNullOrEmptyMatcher)) { kind = MatcherKind.NullOrEmpty; } else if (matcherObject.GetType() == typeof(RangeMatcher <>).MakeGenericType(typedMatcher.Type)) { kind = MatcherKind.Range; } else if (matcherObject.GetType() == typeof(PredicateMatcher <>).MakeGenericType(typedMatcher.Type)) { kind = MatcherKind.Predicate; } if (kind != MatcherKind.Unknown) { IMatcher matcher; if (MockingUtil.TryGetAs(matcherObject, out matcher)) { argType = typedMatcher.Type != null ? typedMatcher.Type : paramInfo.ParameterType.IsArray ? paramInfo.ParameterType.GetElementType() : paramInfo.ParameterType; expressionString = matcher.DebugView; } } } else if (matcherObject.GetType() == typeof(ParamsMatcher)) { IContainerMatcher containerMatcher; if (MockingUtil.TryGetAs <IContainerMatcher>(matcherObject, out containerMatcher)) { kind = MatcherKind.Params; paramsMatchers = containerMatcher.Matchers.Select( contained => { MatcherInfo[] dummy; var result = FromMatcherAndParamInfo(contained, paramInfo, out dummy); result.IsParamsArg = true; return(result); }) .ToArray(); } } else if (matcherObject.GetType() == typeof(AnyMatcher)) { kind = MatcherKind.Any; } return(new MatcherInfo(kind, argType, paramInfo.Position, paramInfo.Name, expressionString)); }