IsAssignableFrom checks covariance and contravariance, you do not need anything:
typeof(IEnumerable<object>).IsAssignableFrom(typeof(IEnumerable<string>)).Dump();
typeof(IEnumerable<string>).IsAssignableFrom(typeof(IEnumerable<object>)).Dump();
typeof(Action<string>).IsAssignableFrom(typeof(Action<object>)).Dump();
typeof(Action<object>).IsAssignableFrom(typeof(Action<string>)).Dump();
source
share