2011-01-05 89 views
0

由于属性不会继承在C#中(至少我没认为他们做过) - 当运行MyTestMethod测试时,下面的代码如何仍显示Hello弹出:C#属性不应该继承

[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

它不应该,除非MyTestMethod调用foo,但无关与C#属性,它可以被遗传。 – Firoso 2011-01-05 22:50:04

+0

Foo用TestClass测试继承的[TestInitialize]属性进行装饰。但是,如上所述,属性可以被继承。 – 2011-01-05 22:56:31

回答

3

属性默认继承但这可以被禁用 - 见AttributeUsage.Inherited

如果你装饰用AttributeUsage属性的属性定义,您可以设置该属性:

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

如果不是因为工作是让foo方法虚拟,只是覆盖它,并把TestInitialize在你的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

谢谢 - 它正在工作,我只是没有预料到它。我(无知)不认为属性可以继承。 – 2011-01-05 22:57:29