Можно ли создать анализатор Roslyn, который требует, чтобы любой класс, производный от определенного базового класса, включал статическое поле? - PullRequest
0 голосов
/ 18 апреля 2019

Это урезанная версия кода, который у меня сейчас есть.

public abstract class Base
{

}

public interface IStringConstructable
{
    Base Construct(string s);
}

public interface IStreamConstructable
{
    Base Construct(Stream stream);
}

public class Derived1 : Base, IStreamConstructable
{
    private static Derived1 singleton = new Derived1();
    public static Derived1 Singleton { get { return singleton; } }

    private Derived1() { }
    public Derived1(Stream stream) { }

    Base IStreamConstructable.Construct(Stream stream)
    {
        return new Derived1(stream);
    }
}

public class Derived2 : Base, IStringConstructable, IStreamConstructable
{
    private static Derived2 singleton = new Derived2();
    public static Derived2 Singleton { get { return singleton; } }

    private Derived2() { }
    public Derived2(string s) { }
    public Derived2(Stream stream) { }

    Base IStringConstructable.Construct(string s)
    {
        return new Derived2(s);
    }

    Base IStreamConstructable.Construct(Stream stream)
    {
        return new Derived2(stream);
    }
}

Весь смысл в том, что я хочу избегать использования отражения везде, где это возможно.И я хочу, чтобы все, что требуется в реализации производного типа, было требованием времени компиляции.Я могу получить список экземпляров каждого интерфейса, который реализован для данного производного типа.Затем я могу вызвать правильный метод Construct в зависимости от сценария.Знать, присутствует ли поле / свойство Singleton, является проблемой.Нет гарантии, что это свойство будет существовать в каждом производном классе, потому что это свойство не требуется для базового класса.И это свойство не должно быть обязательным для каждого производного класса.Только те, которые влияют на один из интерфейсов.Без интерфейсов нет гарантии, что соответствующий конструктор будет существовать.

Все это приводит меня к моему вопросу о том, возможно ли создать анализатор Roslyn, который может проверять, содержит ли конкретный класс определенныйсвойство / поле.Надеюсь, это имеет смысл.

...