Получение всех методов с пользовательским атрибутом в c# никогда не находит метод - PullRequest
1 голос
/ 29 февраля 2020

Итак, я создал эту функцию, чтобы получить все методы с пользовательским атрибутом ExecuteFromConsole

    [ExecuteFromConsole("test", "help")]
    static void Test(string[] args)
    {
        Debug.Log("Test Ran");
    }

    public void AddAttributeCommands()
    {
        //get all methods with the execute attribute
        var methods = AppDomain.CurrentDomain.GetAssemblies()
                               .SelectMany(x => x.GetTypes())
                               .Where(x => x.IsClass)
                               .SelectMany(x => x.GetMethods())
                               .Where(x => x.GetCustomAttributes(typeof(ExecuteFromConsoleAttribute), false).FirstOrDefault() != null);

        //adds them to commands
        foreach (var method in methods) 
        {
            Debug.Log("Found attribute");
            ExecuteFromConsoleAttribute attribute = (ExecuteFromConsoleAttribute)method.GetCustomAttributes(typeof(ExecuteFromConsoleAttribute), false).First();
            if(!method.IsStatic)
            {
                Debug.LogError("ExecuteFromConsoleAttribute must be used on static functions only");
                continue;
            }
            CommandFunc func = (CommandFunc)Delegate.CreateDelegate(typeof(CommandFunc), method);
            AddCommand(attribute.command, func, attribute.help);
        }
    }

, который отлично работал, когда я сначала тестировал его, но теперь он никогда не войдет в foreach l oop и Debug.log("found attribute") означает, что он не находит метод, который прямо над ним с атрибутом. AFAIK Я не изменил ничего, что должно было повлиять на это.

Кто-нибудь знает, почему он не работает, или я все делаю неправильно, и есть лучший способ, которым я должен был бы заниматься вместо этого?

Проект находится в единство, если это влияет на что-либо

1 Ответ

0 голосов
/ 29 февраля 2020

Значение по умолчанию для GetMethods - «что-нибудь опубликованное c», но ваш метод не является методом. Попробуйте добавить BindingFlags.NonPublic | BindingFlags.Static к вызову GetMethods, чтобы дать ему подсказку.

...