문제

특정 속성으로 메소드를 호출하고 싶습니다. 그래서 나는 모든 어셈블리와 내 속성으로 메소드를 찾는 모든 방법을 순환하고 있습니다. 잘 작동하지만 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
        }
    }
}

문제는 특정 방법을 포함하는 클래스의 인스턴스를 모른다는 것입니다. 따라서 메소드가 정적이지 않기 때문에 제대로 호출 할 수 없습니다. 또한 가능하면이 수업의 새 인스턴스를 만드는 것을 피하고 싶습니다.

도움이 되었습니까?

해결책

이것은 코딩보다는 문제 정의 측면에서 문제로 나옵니다.

인스턴스 메소드는 호출 된 인스턴스에 따라 다릅니다. 인스턴스 메소드를 호출하지 않고 인스턴스 메소드를 호출하는 것은 의미가 없습니다. (Martin이 말했듯이, 어떤 인스턴스가 호출되는지 신경 쓰지 않는 인스턴스 방법은 거의 항상 정적이어야합니다. 이에 대해 생각할 수있는 유일한 예외는 가상 메소드이며, 인스턴스가 사용할 구현이 암시 적으로 사용할 수있는 구현을 지정합니다.)

정말로 무엇을 해결하십시오 수단 주석이 달린 인스턴스 메소드가있는 맥락에서. 어쨌든 방법을 호출하려는 이유는 무엇입니까? 더 큰 그림은 무엇입니까? 어떤 맥락이 있습니까? 나는 컨텍스트의 개념을 원할 것이라고 강력하게 생각합니다 - 당신이 ~할 수 있다 인스턴스 메소드를 호출하십시오.

다른 팁

비 정적 메소드는 인스턴스 특이 적이므로 클래스를 인스턴스화하여 메소드를 호출해야합니다. 코드가 정의 된 위치를 변경하는 기능이 있고 메소드가 인스턴스의 일부가 될 필요가없는 경우 (클래스 내부의 비 정적 특성 또는 메소드에 액세스하거나 수정하지 않음) 모범 사례는 그렇습니다. 어쨌든 방법을 정적으로 만들어야합니다.

정적으로 만들 수 없다고 가정하면 필요한 코드는 다음과 같습니다.

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

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

실제로, 당신이해야 할 일은 기존 객체의 목록을 만들고 목록을 검색하는 것입니다. 따라서 이러한 호출 가능한 객체를 만들 때 목록에 저장할 수 있습니다 (또는 목록은 호출 가능한 객체에 대한 설명이있는 다른 종류의 객체 목록이어야합니다). 그런 다음 런타임에 목록을 스캔하고 처리중인 이벤트 유형과 일치하는 것을 찾은 다음 메소드 정보를 찾아서 메소드 정보에서 .invoke를 호출 할 수 있습니다. 또한 적절한 인수를 전달해야하지만 올바른 유형의 객체의 벡터를 만들어이를 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top