int CompareCloserType (Type t1, Type t2)
{
if (t1 == t2)
return 0;
#if NET_2_0
if (t1.IsGenericParameter && !t2.IsGenericParameter)
return 1; // t2
if (!t1.IsGenericParameter && t2.IsGenericParameter)
return -1; // t1
#endif
if (t1.HasElementType && t2.HasElementType)
return CompareCloserType (
t1.GetElementType (),
t2.GetElementType ());
if (t1.IsSubclassOf (t2))
return -1; // t1
if (t2.IsSubclassOf (t1))
return 1; // t2
if (t1.IsInterface && Array.IndexOf (t2.GetInterfaces (), t1) >= 0)
return 1; // t2
if (t2.IsInterface && Array.IndexOf (t1.GetInterfaces (), t2) >= 0)
return -1; // t1
// What kind of cases could reach here?
return 0;
}