in src/TestFramework/Extension.Desktop/RuntimeTypeHelper.cs [435:507]
internal static int FindMostSpecificType(Type c1, Type c2, Type t)
{
// If the two types are exact move on...
if (c1 == c2)
{
return 0;
}
if (c1 == t)
{
return 1;
}
if (c2 == t)
{
return 2;
}
bool c1FromC2;
bool c2FromC1;
if (c1.IsByRef || c2.IsByRef)
{
if (c1.IsByRef && c2.IsByRef)
{
c1 = c1.GetElementType();
c2 = c2.GetElementType();
}
else if (c1.IsByRef)
{
if (c1.GetElementType() == c2)
{
return 2;
}
c1 = c1.GetElementType();
}
else
{
if (c2.GetElementType() == c1)
{
return 1;
}
c2 = c2.GetElementType();
}
}
if (c1.IsPrimitive && c2.IsPrimitive)
{
c1FromC2 = true;
c2FromC1 = true;
}
else
{
c1FromC2 = c1.IsAssignableFrom(c2);
c2FromC1 = c2.IsAssignableFrom(c1);
}
if (c1FromC2 == c2FromC1)
{
return 0;
}
if (c1FromC2)
{
return 2;
}
else
{
return 1;
}
}