Код, опубликованный для получения наиболее конкретной общей базы для набора типов, имеет некоторые проблемы. В частности, он ломается, когда я передаю typeof (объект) как один из типов. Я считаю, что следующее проще и (лучше) правильно.
public static Type GetCommonBaseClass (params Type[] types)
{
if (types.Length == 0)
return typeof(object);
Type ret = types[0];
for (int i = 1; i < types.Length; ++i)
{
if (types[i].IsAssignableFrom(ret))
ret = types[i];
else
{
// This will always terminate when ret == typeof(object)
while (!ret.IsAssignableFrom(types[i]))
ret = ret.BaseType;
}
}
return ret;
}
Я также проверял:
Type t = GetCommonBaseClass(typeof(OleDbCommand),
typeof(OdbcCommand),
typeof(SqlCommand));
И получил typeof(DbCommand)
. И с:
Type t = GetCommonBaseClass(typeof(OleDbCommand),
typeof(OdbcCommand),
typeof(SqlCommand),
typeof(Component));
И получил typeof(Compoment)
. И с:
Type t = GetCommonBaseClass(typeof(OleDbCommand),
typeof(OdbcCommand),
typeof(SqlCommand),
typeof(Component),
typeof(Component).BaseType);
И получил typeof(MarshalByRefObject)
. И с
Type t = GetCommonBaseClass(typeof(OleDbCommand),
typeof(OdbcCommand),
typeof(SqlCommand),
typeof(Component),
typeof(Component).BaseType,
typeof(int));
И получил typeof(object)
.