2012-05-25 4 views
1

나는 차트를 가지고 있으며 노드를 선택하면 여러 차트가 표시되는 트리 뷰가 있습니다. 트리 뷰 노드의 이름은 xxxChart이고, 다양한 차트를 가져 오는 메소드의 이름은 xxxChart이며 이름이 xxxChart 인 노드입니다.리플렉션을 사용하여 메소드를 가져와 Action 객체에 지정하는 방법은 무엇입니까?

변경할 수있는 매개 변수 (예 : 시작/종료 날짜)가있는 경우 업데이트 된 매개 변수를 선택하여 새로 고치려면 현재 차트의 메서드를 다시 실행해야합니다. 노드가 선택 될 때마다 설정되는 DisplayChart라는 Action 객체를 갖는 것이 좋습니다. 다음 매개 변수를 변경하면 그냥 DisplayChart()를 호출합니다.

이제는이 문제를 해결하기위한 더 좋은 패턴에 대한 아이디어를 환영하지만 제 질문은 다음과 같습니다. 어떻게 리플렉션을 사용하여 Action 객체에 할당 할 수있는 것을 얻을 수 있습니까? 리플렉션을 사용하여 메서드를 호출하는 방법을 알고 있지만 노드를 선택하면 해당 노드가 DisplayChart Action 객체에 일치하는 이름으로 메서드를 저장하기 만하면됩니다.

물론 저는 Action 객체 대신 MethodInfo 객체를 사용하고 리플렉션을 사용하여 메소드를 호출 할 수 있다는 것을 알고 있습니다. 그러나 나는 아직도이 방법을 사용하는 방법이 궁금합니다.

답변

3

당신이 Delegate.CreateDelegate.

일예의 오버로드 중 하나를 사용할 수없는 방법 명명 규칙 및 반사에 매우 강력 의존하지만, 직접 질문에 대답

object boundObject = ... 
MethodInfo method = ... 

Action action = (Action)Delegate.CreateDelegate(typeof(Action), 
               boundObject, 
               method); 
+0

performant를 의미하는 것은 견고합니까? 아니면 소프트웨어와 관련하여 실제로 의미하는 것을 의미합니까? 공연자라면 Fasterflect를 체크 아웃해야합니다. Fasterflect는 일반적인 방식으로 반사하는 것보다 50 배 빠른 속도입니다. 그러나 만약 당신이 그것을 암시한다면 그것은 버그가있는 소프트웨어로 이어진다. 나는 누가 코드를 작성하는지에 달려 있다고 말할 것이다. :) –

+0

사이드 노트 : 실제로 내 데이터 레이어에서 리플렉션을 사용하여 db를 기반으로하는 비즈니스 오브젝트로 데이터를 이동시킨다. 특성의 이름 (제공된 경우 속성에 지정된 별명). 나는 처음에는 퍼포먼스에 실망하여 리플렉션이 더 빨라질 수 있는지 검색하고 Fasterflect를 찾았습니다. 이제 SQL Server Management Studio에서 직접 쿼리를 수행하는 것과 같이 실제로 (개체 채우기를 포함하여) 빠르게 수행됩니다. –

관련 문제