2010-06-01 6 views
1

J'ai récemment mis à niveau un projet C# de .NET 3.5 vers .NET 4. J'ai une méthode qui extrait toutes les méthodes de test MSTest d'une liste donnée d'instances MethodBase. Son corps ressemble à ceci:changements d'attributs personnalisés dans .NET 4

return null == methods || methods.Count() == 0 
    ? null 
    : from method in methods 
     let testAttribute = Attribute.GetCustomAttribute(method, 
      typeof(TestMethodAttribute)) 
     where null != testAttribute 
     select method; 

Cela a fonctionné dans .NET 3.5, mais depuis la mise à niveau mes projets à .NET 4, ce code renvoie toujours une liste vide, même donné une liste des méthodes contenant une méthode qui est marqué avec [TestMethod]. Est-ce que quelque chose a changé avec les attributs personnalisés dans .NET 4?

Debugging, je trouve que les résultats de GetCustomAttributesData() sur la méthode d'essai donne une liste de deux CustomAttributeData qui sont décrites en 2010 Visual Studio fenêtre des sections locales 'est comme:

  1. Microsoft.VisualStudio.TestTools.UnitTesting.DeploymentItemAttribute("myDLL.dll")
  2. Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute() - ce est ce que je cherche

Quand j'appelle GetType() sur cette seconde cependant, par exemple CustomAttributeData, je reçoisdix . Comment puis-je obtenir TestMethodAttribute sur le CustomAttributeData, afin que je puisse extraire des méthodes de test à partir d'une liste de MethodBase s?

Répondre

2

erreur stupide de ma part: ma méthode d'extraction de méthode d'essai était dans un projet de bibliothèque de classe qui faisait référence à Microsoft.VisualStudio.QualityTools.UnitTestFramework afin qu'il puisse chercher TestMethodAttribute en tant qu'attribut personnalisé. Lorsque j'ai mis à niveau ma solution de VS 2008 vers VS 2010, le processus de conversion a automatiquement mis à jour les références de Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version = 9.0.0.0 à Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version = 10.0.0.0 dans mes projets de test. Cependant, il n'a pas mis à jour la référence dans mon projet de bibliothèque de classes, ce qui indiquait toujours l'ancienne référence UnitTestFramework. Quand j'ai changé ce projet pour pointer vers la bibliothèque 10.0.0.0, mon code ci-dessous a travaillé comme prévu:

return null == methods || methods.Count() == 0 
    ? null 
    : from method in methods 
     let testAttribute = Attribute.GetCustomAttribute(method, 
      typeof(TestMethodAttribute)) 
     where null != testAttribute 
     select method; 

En outre, le code Jon suggested fonctionnait aussi bien, une fois que je mis à jour la référence.

2

Avez-vous essayé d'utiliser

method.GetCustomAttributes(typeof(TestMethodAttribute), false) 

à la place? Demander la cible pour les attributs personnalisés a généralement été la façon dont je suis allé chercher les.

Voici un exemple hâtif:

using System; 
using System.Linq; 

[AttributeUsage(AttributeTargets.All)] 
public class FooAttribute : Attribute {} 

class Test 
{ 
    static void Main() 
    { 
     var query = typeof(Test).GetMethods() 
      .Where(method => method.GetCustomAttributes(
           typeof(FooAttribute), false).Length != 0); 

     foreach (var method in query) 
     { 
      Console.WriteLine(method); 
     } 
    } 

    [Foo] 
    public static void MethodWithAttribute1() {} 

    [Foo] 
    public static void MethodWithAttribute2() {} 

    public static void MethodWithoutAttribute() {} 

} 
+0

Oui, et j'ai essayé de passer 'true' afin qu'il vérifie aussi les ancêtres. Je récupère toujours un tableau vide de 'object's. –

+0

@Sarah: Dans ce cas, veuillez poster un programme court mais complet démontrant le problème. J'ai montré un exemple qui * fonctionne *. –

+0

fausse alarme! Mon projet faisait référence à l'ancienne version .NET 3.5/VS 2008 de la bibliothèque UnitTestFramework. Passer à la version .NET 4/VS 2010 de UnitTestFramework (10.0.0.0) a résolu le problème. –