Я работал над API, который инкапсулирует другой, более сложный в использовании API. Цель состоит в том, чтобы мой API не требовал, чтобы пользователь касался какого-либо старого API, 1) не требуя каких-либо параметров классов в старом API и 2) не возвращая экземпляры классов в старом API. Есть ли программа, возможно плагин для Visual Studio, которая может анализировать мое решение на C # и давать мне список всех типов возврата из общедоступных методов в общедоступных классах, а также всех типов параметров в таких методах? В противном случае мне кажется, что мне придется вручную пройти через все мои классы и посмотреть, доступен ли пользователю какой-либо из старых API.
Редактировать: Поскольку я все равно использую MSTest для модульного тестирования моего API, я добавил еще один модульный тест для использования отражения и Fail, если какие-либо части старого API выставлены. Тем не менее, я застрял с проблемой отражения. У меня using OldAPI
в классе модульного тестирования, а затем я использую
AppDomain.CurrentDomain.GetAssemblies().SelectMany(
assembly => assembly.GetTypes()
)
, чтобы получить список типов во всех загруженных сборках. Затем я перебираю те из них в надежде сравнить список типов только с теми, которые находятся в пространстве имен OldAPI
. Проблема в том, что пространство имен OldAPI
не отображается. Я вижу такие пространства имен, как Microsoft.VisualStudio.TestTools, System.Reflection и другие, которые включаются с помощью операторов using
в тестовый класс, но не содержат «OldAPI». Может ли это быть из-за COM-компонентов со старым API, поэтому AppDomain.CurrentDomain.GetAssemblies()
не включает сборку, даже если она включена с помощью оператора using
в классе?
Решение: Я получил необходимую сборку, произвольно выбрав один класс, который, как я знаю, находится в OldAPI
, и сделал следующее, благодаря SLaks 'комментарий:
Func<Type, bool> isBad = t => t.Assembly == typeof(OldAPI.SomeClass).Assembly;
Вот фрагмент моего модульного теста для проверки, использует ли какой-либо из классов моего API какой-либо из классов OldAPI
, благодаря ответу SLaks ':
MethodInfo[] badMethods = methods.Where(
m => (
isBad(m.ReturnType) ||
m.GetParameters().Any(p => isBad(p.ParameterType))
) && !isBad(m.DeclaringType)
).ToArray();
string[] badMethodNames = badMethods.Select(
m => m.DeclaringType.Name + "." + m.Name
).Distinct().ToArray();
Assert.AreEqual(0, badMethodNames.Length, "Some methods in " +
monitoredNamespaces + " projects expose OldAPI: " +
string.Join(", ", badMethodNames));