Атрибуты методов / членов виртуального базового класса в C # Class Inheritance - PullRequest
0 голосов
/ 22 марта 2012

Я хочу использовать VS2010 Test Framework для некоторых тестов с закодированным пользовательским интерфейсом. Я настроил следующий базовый тестовый класс:

[CodedUITest]
public abstract class TestObjectBase
{
    public TestContext TestContext { get; set; }

    public TestObjectBase()
    {
    }

    [TestInitialize]
    public virtual void Initialize()
    {
        Database.ResetArchiveDatabase();
        Database.ResetSettingsDatabase();
        Database.ResetTransactionsDatabase();
    }

    [TestCleanup]
    public virtual void Dispose()
    {
    }
}

Итак, вопрос, который я предполагаю, следующий: атрибуты [CodedUITest], [TestInitialize] и [TestCleanup] не имеют элементов AttributeUsage= и Inherited.

Будет ли какой-либо экземпляр дочернего класса, который наследует от TestObjectBase, распространять эти атрибуты на себя (в случае [CodedUITest] и его членов (в случае [TestInitialize] и [TestCleanup])?

*

1 Ответ

0 голосов
/ 23 марта 2012

Значение по умолчанию для свойства AttributeUsageAttribute.Inherited равно true, поэтому я предполагаю, что то же самое применимо, если вы вообще не используете AttributeUsageAttribute. И мои тесты, похоже, согласны с этим.

Но, как правильно указывает payo, AttributeUsageAttribute.Inherited - это скорее рекомендация. Это потому, что есть несколько способов получить атрибуты некоторого типа (или его члена):

  1. Звоните GetCustomAttributes(inherit: false) по типу. Таким образом, никакие атрибуты от базового типа (типов) не наследуются, даже если они указали Inherited = true.

  2. Звоните GetCustomAttributes(inherit: true). Это единственный способ, который действительно соблюдает значение AttributeUsageAttribute.Inherited.

  3. Пройдите по иерархии наследования и вызовите GetCustomAttributes(inherit: false) для каждого типа. Таким образом, вы получаете все атрибуты из базового типа (типов), даже если они указали Inherited = false.

Большинство инструментов, вероятно, будут идти с # 2, потому что это самый разумный вариант, но, конечно, не единственный.

...