Как прервать компиляцию, если какой-то метод имеет атрибут A, но не имеет атрибута B? - PullRequest
0 голосов
/ 15 мая 2019

Как прервать компиляцию, если используется только один из следующих атрибутов?

    public class Attribute1 : Attribute {}
    public class Attribute2 : Attribute {}

    [Attribute1()]
    [Attribute2()]
    public void SomeMethod()
    {

    }

Если метод имеет атрибут «Attribute1» - он должен иметь атрибут «Attribute2», и наоборот.В противном случае компиляция должна завершиться с правильным сообщением.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Вам нужно написать анализатор кода и подключить его к msbuild файлам , затем упаковать эти цели сборки в nuget , если вы хотите опубликоватьваша библиотека.

0 голосов
/ 15 мая 2019

Вы можете Reflections in C# для этой цели. ( Источник )

MSDN Описание отражения

Вы можете использовать отражение, чтобы динамически создавать экземпляр типа, связывать тип с существующим объектом или получать тип от существующего объекта и вызывать его методы или обращаться к его полям и свойствам. Если вы используете атрибуты в своем коде, рефлексия позволяет вам получить к ним доступ .

Используйте приведенный ниже код для доступа к атрибутам в вашем коде

try
    {
        // Get the type of MyClass1.
        Type myType = typeof(MyClass1);
        // Get the members associated with MyClass1.
        MemberInfo[] myMembers = myType.GetMembers();

        // Display the attributes for each of the members of MyClass1.
        for(int i = 0; i < myMembers.Length; i++)
        {
            Object[] myAttributes = myMembers[i].GetCustomAttributes(true);
            if(myAttributes.Length > 0)
            {
                Console.WriteLine("\nThe attributes for the member {0} are: \n", myMembers[i]);
                for(int j = 0; j < myAttributes.Length; j++)
                    Console.WriteLine("The type of the attribute is {0}.", myAttributes[j]);
            }
        }
    }
    catch(Exception e)
    {
        Console.WriteLine("An exception occurred: {0}", e.Message);
    }

Затем после получения всех attributes, связанных с вашим class, приступайте к выполнению ваших требований, в противном случае, если у вас нет обоих attributes, бросьте exception.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...