private static void TestAssignability(Type a, Type b)
        {
            var aData = a.IsGenericParameter ? GenericTypeParameterData.FromType(a) : TypeData.FromType(a);
            var bData = b.IsGenericParameter ? GenericTypeParameterData.FromType(b) : TypeData.FromType(b);

            if (aData == null || bData == null)
            {
                Assert.Inconclusive("Unable to get one of the types");
            }

            if (a.IsImplicitlyAssignableFrom(b))
            {
                Assert.IsTrue(aData.IsAssignableFromNew(bData), string.Format("The type should be assignable: {0} <- {1}", aData.Name, bData.Name));
            }
            else
            {
                Assert.IsFalse(aData.IsAssignableFromNew(bData), string.Format("The type should not be assignable: {0} <- {1}", aData.Name, bData.Name));
            }

            if (b.IsImplicitlyAssignableFrom(a))
            {
                Assert.IsTrue(bData.IsAssignableFromNew(aData), string.Format("The type should be assignable: {0} <- {1}", bData.Name, aData.Name));
            }
            else
            {
                Assert.IsFalse(bData.IsAssignableFromNew(aData), string.Format("The type should not be assignable: {0} <- {1}", bData.Name, aData.Name));
            }
        }
        public static GenericTypeParameterCollection GetGenericParameters(IEnumerable <GenericParameter> genericArguments, MemberDataBase declaringMember)
        {
            return(new GenericTypeParameterCollection(genericArguments.Select(a =>
            {
                var genericParameter = GenericTypeParameterData.FromType(a);

                if (declaringMember != null)
                {
                    Debug.Assert(genericParameter.GenericDeclaringMember == null, "The GenericDeclaringMember should not be set twice.");
                    genericParameter.GenericDeclaringMember = declaringMember;
                }

                return genericParameter;
            })));
        }