Для C # Project, как вызвать пользовательскую ошибку сборки, если кто-то пытается использовать определенный метод из класса Framework? - PullRequest
0 голосов
/ 01 марта 2019

Для проекта C # я хочу включить шаг сборки или что-то интегрированное в проект, что должно вызвать ошибку сборки, если какой-либо разработчик пытается использовать определенный метод из классов платформы, вместо этого я хочу, чтобы разработчики использовали метод расширения для того же самого.Однако я хочу навязать это как ошибку времени компиляции.В качестве примера, ради имени, я хочу, чтобы разработчик в данном проекте не использовал string.Intern, вместо этого всегда должен использовать string.SpecialIntern.Каковы разные способы достижения этого?Я пытался использовать Roslyn-code-analysis, но не смог написать рабочее правило для этого, поэтому я не уверен, что это правильное решение этой проблемы.Может ли кто-нибудь подробно рассказать мне, как решить эту проблему с некоторыми примерами?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Это звучит как то, что вы можете сделать с помощью специального анализатора кода.Я еще не пробовал, но считаю, что можно написать свои собственные анализаторы.

Эта статья от Microsoft утверждает, что рассказывает, как это сделать:

https://docs.microsoft.com/en-us/visualstudio/extensibility/getting-started-with-roslyn-analyzers?view=vs-2017

Вот прямая ссылка на учебник, на который есть ссылка в этой статье:

https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/tutorials/how-to-write-csharp-analyzer-code-fix

0 голосов
/ 01 марта 2019

AFAIK, нет способа достичь того, что вы пытаетесь сделать.

Однако, решение было бы просто вызвать метод расширения.

public static class Extension
{
    public static bool DoStuff(this Class stuff)
    {
        return false;
    }
}

public class Class
{
    public bool DontCallMe()
    {
        return this.DoStuff();
    }
}
Class myClass = new Class();
myClass.DontCallMe();

Очевидно,это работает, только если вы можете изменить код вашего класса (что, я полагаю, вы не можете)

Если этот метод помечен как виртуальный, вы можете создать класс Wrapper, который переопределяет этот метод.

public static class Extension
{
    public static bool DoStuff(this Class stuff)
    {
        return false;
    }
}

public class Class : Base
{
    public override bool DontCallMe()
    {
        return this.DoStuff();
    }
}

public class Base
{
    public virtual bool DontCallMe()
    {
        return false;
    }
}

Другой подход - сделать то, что я описал в этом этом посте.

...