2011-01-05 5 views
0

Les attributs ne héritent pas en C# (au moins je ne pensais pas qu'ils ont fait) - comment le code suivant affiche toujours le menu contextuel Bonjour lorsque le test est exécuté MyTestMethod:C# attributs ne sont pas censés Hériter

[TestClass] 
public class BaseTestClass { 
    [TestInitialize] 
    public void Foo() { 
     System.Windows.Forms.MessageBox.Show("Hello"); 
    } 
} 

[TestClass] 
public class TestClass : BaseTestClass { 
    [TestMethod] 
    public void MyTestMethod() { 
     Assert.IsTrue(true); 
    } 
} 
+0

il ne devrait pas, sauf si les appels MyTestMethod Foo, mais cela n'a rien à voir avec les attributs C# , qui peut incidemment être hérité. – Firoso

+0

Foo est décoré avec l'attribut [TestInitialize], hérité par le test TestClass. Mais oui, comme indiqué, les attributs peuvent être hérités. –

Répondre

3

les attributs sont hérités par défaut mais cela peut être désactivé - voir AttributeUsage.Inherited

Si vous décorez la définition d'attribut avec un attribut AttributeUsage, vous pouvez définir cette propriété:

[AttributeUsage(AttributeTargets.Class, Inherited = false)] 
public class MyAttribute : Attribute 
{ 
} 
0

Si ne fonctionne pas comme est de faire méthode Foo virtuelle et juste passer outre, et mettre le TestInitialize à votre méthode de remplacement testclass

[TestClass] 
    public class BaseTestClass 
    { 

    public virtual void Foo() 
    { 
     System.Windows.Forms.MessageBox.Show("Hello"); 
    } 
    } 

    [TestClass] 
    public class TestClass : BaseTestClass 
    { 
    [TestInitialize] 
    public override void Foo() 
    { 
     base.Foo(); 
    } 

    [TestMethod] 
    public void MyTestMethod() 
    { 
     Assert.IsTrue(true); 
    } 
    } 
+0

Merci - ça fonctionne, je ne m'y attendais pas. Je (par ignorance) ne pensais pas que les attributs pouvaient hériter. –

Questions connexes