Могу ли я использовать PostSharp DisposableAttribute в производной иерархии классов - PullRequest
1 голос
/ 07 января 2020

У меня есть структура класса, подобная следующей:

public abstract class Class1 
{
}
public class Class2 : Class1
{
}

Оба эти класса могут содержать объекты, реализующие IDisposable.

Можно ли использовать PostSharp DisposableAttribute на Class1 класс и Class2 наследуют эту функциональность аспектов.

1 Ответ

1 голос
/ 07 января 2020

Да, аспект [Disposable] наследуется автоматически. Установив PostSharp Tools для Visual Studio (https://www.postsharp.net/download), вы увидите подчеркнутое имя типа Class2. Если навести указатель мыши над именем типа, это показывает, как PostSharp улучшает тип.

PostSharp Tools for Visual Studio show how the Class2 type is enhanced

Кроме того, проходят следующие тесты:

using NUnit.Framework;
using PostSharp;
using PostSharp.Patterns.Model;
using System;

namespace DisposableTestProject
{
    public class DisposableDependency : IDisposable
    {
        public bool IsDisposed { get; private set; }

        public void Dispose()
        {
            this.IsDisposed = true;
        }
    }

    [Disposable]
    public class Class1
    {
        [Child]
        public DisposableDependency DepencencyInClass1 { get; } = new DisposableDependency();
    }

    public class Class2 : Class1
    {
        [Child]
        public DisposableDependency DepencencyInClass2 { get; } = new DisposableDependency();
    }

    public class Tests
    {
        [Test]
        public void TestClass1()
        {
            Class1 class1 = new Class1();

            Assert.IsFalse(class1.DepencencyInClass1.IsDisposed);

            Post.Cast<Class1, IDisposable>(class1).Dispose();

            Assert.IsTrue(class1.DepencencyInClass1.IsDisposed);
        }

        [Test]
        public void TestClass2()
        {
            Class2 class2 = new Class2();

            Assert.IsFalse(class2.DepencencyInClass1.IsDisposed);
            Assert.IsFalse(class2.DepencencyInClass2.IsDisposed);

            Post.Cast<Class2, IDisposable>(class2).Dispose();

            Assert.IsTrue(class2.DepencencyInClass1.IsDisposed);
            Assert.IsTrue(class2.DepencencyInClass2.IsDisposed);
        }
    }
}
...