private static bool CheckArg()

in src/Microsoft.Azure.WebJobs.Host/Bindings/PatternMatcher.cs [287:347]


        private static bool CheckArg(Type openType, Type specificType, Dictionary<string, Type> genericArgs)
        {
            if (openType == specificType)
            {
                return true;
            }

            if (openType.IsAssignableFrom(specificType))
            {
                // Allow derived types. 
                return true;
            }

            // Is it a generic match?
            // T, string
            if (openType.IsGenericParameter)
            {
                string name = openType.Name;
                return AddGenericArg(genericArgs, name, specificType);
            }

            // T[]
            if (openType.IsArray && specificType.IsArray)
            {
                var elementType = openType.GetElementType();
                var specificElementType = specificType.GetElementType();
                if (elementType.IsGenericParameter)
                {
                    if (!AddGenericArg(genericArgs, elementType.Name, specificElementType))
                    {
                        return false;
                    }
                    return true;
                }
            }

            // IFoo<T>, IFoo<string> 
            if (specificType.IsGenericType && openType.IsGenericType)
            {
                if (specificType.GetGenericTypeDefinition() != openType.GetGenericTypeDefinition())
                {
                    return false;
                }

                var typeArgs = openType.GetGenericArguments();
                var specificTypeArgs = specificType.GetGenericArguments();

                int len = typeArgs.Length;

                for (int i = 0; i < len; i++)
                {
                    if (!AddGenericArg(genericArgs, typeArgs[i].Name, specificTypeArgs[i]))
                    {
                        return false;
                    }
                }
                return true;
            }

            return false;
        }