J'ai travaillé sur une API qui encapsule une API plus complexe à utiliser. L'objectif est que mon API ne nécessite pas que l'utilisateur touche l'une des anciennes API en 1) ne nécessitant aucun paramètre de classes dans l'ancienne API et 2) ne renvoyant aucune instance de classes dans l'ancienne API. Existe-t-il un programme, peut-être un plugin Visual Studio, capable d'analyser ma solution C# et de me fournir une liste de tous les types de retour de méthodes accessibles au public dans des classes accessibles au public, ainsi que tous les types de paramètres dans ces méthodes? Sinon, il semble que je vais devoir passer en revue manuellement toutes mes classes et voir si l'une des anciennes API est exposée à l'utilisateur. Depuis que j'utilise MSTest pour tester mon API de toute façon, j'ai ajouté un autre test unitaire pour utiliser la réflexion et Fail si des parties de l'ancienne API sont exposées. Cependant, je suis coincé avec un problème de réflexion. Je using OldAPI
dans la classe de test unitaire, puis-je utiliserRéflexion pour lister les types de retour, les paramètres dans l'application C# à partir d'un espace de noms spécifique
AppDomain.CurrentDomain.GetAssemblies().SelectMany(
assembly => assembly.GetTypes()
)
pour obtenir une liste des types dans toutes les assemblées actuellement chargées. Je itère alors sur ceux dans l'espoir de réduire la liste des types à seulement ceux dans l'espace de noms OldAPI
. Le problème est que l'espace de noms OldAPI
n'apparaît pas. Je vois des espaces de noms comme Microsoft.VisualStudio.TestTools, System.Reflection, et d'autres qui sont inclus via les instructions using
dans la classe de test, mais pas "OldAPI". Est-ce que cela peut être dû à des choses COM avec l'ancienne API, alors AppDomain.CurrentDomain.GetAssemblies()
n'inclut pas l'assembly même s'il est inclus via une instruction using
dans la classe?
Solution: J'obtenu l'assemblage nécessaire en choisissant arbitrairement une classe que je sais est OldAPI
et de faire ce qui suit, grâce à SLaks 'commentaire:
Func<Type, bool> isBad = t => t.Assembly == typeof(OldAPI.SomeClass).Assembly;
Voici un extrait de mon test unitaire pour le contrôle si l'une des classes de mon API utilisent l'une des OldAPI
« s cours, grâce à SLaks » réponse:
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));
Vous confondez des assemblys avec des espaces de noms. Vous pouvez créer l'assembly de l'ancienne API en écrivant 'typeof (OldType).Assemblée ». – SLaks