// Method to compare two types pointers for type equality // We cannot just compare the pointers as there can be duplicate type instances // for cloned and constructed types. static bool AreTypesEquivalentInternal(TypeInfo pType1, TypeInfo pType2) { if (!pType1.IsInstantiatedTypeInfo() && !pType2.IsInstantiatedTypeInfo()) return pType1.Equals(pType2); if (pType1.IsGenericType && pType2.IsGenericType) { if (!pType1.GetGenericTypeDefinition().Equals(pType2.GetGenericTypeDefinition())) return false; Type[] args1 = pType1.GenericTypeArguments; Type[] args2 = pType2.GenericTypeArguments; Debug.Assert(args1.Length == args2.Length); for (int i = 0; i < args1.Length; i++) { if (!AreTypesEquivalentInternal(args1[i].GetTypeInfo(), args2[i].GetTypeInfo())) return false; } return true; } if (pType1.IsArray && pType2.IsArray) { if (pType1.GetArrayRank() != pType2.GetArrayRank()) return false; return AreTypesEquivalentInternal(pType1.GetElementType().GetTypeInfo(), pType2.GetElementType().GetTypeInfo()); } if (pType1.IsPointer && pType2.IsPointer) { return AreTypesEquivalentInternal(pType1.GetElementType().GetTypeInfo(), pType2.GetElementType().GetTypeInfo()); } return false; }