Вопрос

Я хочу вызывать методы с определенным атрибутом.Итак, я перебираю все сборки и все методы, чтобы найти методы с моим атрибутом.Работает нормально, но как мне вызвать определенный метод, если я получил только его MethodInfo.

AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
foreach (Assembly a in ass)
{
    types = a.GetTypes();
    foreach (Type t in types)
    {
        MethodInfo[] methods = t.GetMethods();
        foreach (MethodInfo method in methods)
        {
            // Invoke a certain method
        }
    }
}

Проблема в том, что я не знаю экземпляр класса, который содержит этот определенный метод.Поэтому я не могу вызвать его должным образом, потому что методы не являются статическими.Я также хочу избежать создания нового экземпляра этого класса, если это возможно.

Это было полезно?

Решение

Это кажется мне проблемой с точки зрения определения проблемы, а не кодирования.

Методы экземпляра зависят от того, в каком экземпляре они вызываются - нет смысла вызывать метод экземпляра, не заботясь о том, для чего он вызывается.(Как говорит Мартин, метод экземпляра, которому все равно, в каком экземпляре он вызывается, почти всегда должен быть статическим.Единственное непосредственное исключение, которое я могу придумать для этого, - это виртуальные методы, где экземпляр неявно указывает, какую реализацию использовать.)

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

Другие советы

Нестатические методы зависят от конкретного экземпляра, поэтому для вызова метода необходимо создать экземпляр класса.Если у вас есть возможность изменять код, в котором он определен, и метод не требует, чтобы он был частью экземпляра (он не получает доступа к каким-либо нестатическим свойствам или методам внутри класса и не изменяет их), то наилучшей практикой было бы в любом случае сделать метод статическим.

Предполагая, что вы не можете сделать его статичным, тогда необходимый вам код выглядит следующим образом:

    foreach (Type t in types)
    {
            object instance = Activator.CreateInstance(t);

            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo method in methods)
            {                    
                method.Invoke(instance, params...);    
            }
    }

На самом деле, я думаю, что вам нужно сделать, это создать список существующих объектов, а затем выполнить поиск по списку.Таким образом, когда вы создаете эти вызываемые объекты, вы должны сохранять их в списке (или, возможно, список должен быть списком объектов какого-либо другого типа, который также содержит описание вызываемого объекта).Затем вы можете просмотреть список во время выполнения, найти тот, который соответствует типу события, которое вы обрабатываете, а затем посмотреть его MethodInfo и вызвать .Вызовите информацию о методе, предполагая, что это то, что вы хотите сделать.Вам также нужно будет передать соответствующие аргументы, но вы можете сделать это, создав вектор объектов нужных типов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top