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;
}