Получить свойства с определенными атрибутами (сборка точно в срок) - PullRequest
0 голосов
/ 24 июня 2019

Моя задача - найти свойства с определенными атрибутами в файлах .cs.Таким образом, я получаю файлы .cs и должен искать их по определенным атрибутам и сохранять их в XML.

Таким образом, в каждом свойстве с атрибутом [ID] я должен хранить значение вместе с идентификатором.В контексте того, как я должен понимать это, используются слова «компилятор точно в срок» и «отражение».Но я не знаю, с чего начать, потому что раньше я никогда не работал с компилятором / отражениями Just-in-Time.

Сначала я попробовал это с регулярными выражениями, но там я не смог получить свойства.Как я могу получить значение свойства, когда я загружаю файл .cs в виде строки?(или что мне вместо этого делать?) Файл .cs, в котором я ищу:

[ID(12345678)]
public string quack {get; set}

Мой скрипт, который я пробовал:

string document = File.ReadAllText(@"FilePath.cs");
    var searchPatternID = @"(?<![\p{Zs}\t]*//.*)(?<!/\*(?:(?!\*/)[\s\S\r])*?)\[[\n\r\s]*ID(.*?\n*?)*?\]";

    var matches = Regex.Matches(document, searchPatternID );

     foreach (var m in matches)
     {
         Console.WriteLine(m);
     }

Здесь я только ищу идентификатор.Как я могу получить значение "кряк"?

Что я ожидаю:

[ID(12345678)]
public string quack {get; set}

public string wuff {get; set}

Здесь я бы ожидал значение кряка вместе с идентификатором.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вы можете использовать этот код

var properties = typeof(MyClass).GetProperties();
        var specificProperty = properties.Where(t => t.CustomAttributes.Any(y => y.AttributeType.FullName == "MyTestAttribute")).ToList()
            .Select(z=>z.CustomAttributes).ToList();
        var values = specificProperty.Select(s => s.First().ConstructorArguments.First().Value).ToList();
0 голосов
/ 24 июня 2019

Если вы хотите получить атрибут ID, вы должны получить CustomAtributes typeof() или .GetType().

var attributes = typeof(YourClass).CustomAttributes;

Тогда вы можете искать свой атрибут и его значение или что угодно.

Таким образом, вы можете получить все свойства и затем искать атрибут:

    var properties = typeof(YourClass).Properties();
    foreach (var prop in properties)
    {
        prop.CustomAttributes.CheckAttribute();
    }
...