private Type MergeTypes(Type type, Type newType) { if (type == null) { return(newType); } else if (newType == null) { return(type); } else if (newType.IsAssignableFrom(type)) { return(newType); } else if (type.IsAssignableFrom(newType)) { return(type); } else if (type.IsClass && newType.IsClass) { var ss = type.GetTypeChain().Reverse(); // System.Object, ..., X, ..., type var ts = newType.GetTypeChain().Reverse(); // System.Object, ..., Y, ..., newType return(Enumerable .Zip(ss, ts, Tuple.Create) .Where(t => t.Item1 == t.Item2) .Last() .Item1); } else if (type == types.Boolean && (newType == types.Int32 || newType == types.Int64)) { return(newType); } else if (newType == types.Boolean && (type == types.Int32 || type == types.Int64)) { return(type); } else if ( (type == types.UInt32 && newType == types.Int32) || (type == types.Int32 && newType == types.UInt32)) { return(newType); } else { throw new InvalidOperationException("Cannot determine type"); } }