문제

런타임에 새로운 유형을 만들 수있는 것이 가능하지만 런타임에 기존 유형의 메소드 본문을 수정할 수 있습니까? 내 계획 (이 작업을 수행 할 수있는 경우)은 사용자 정의 속성으로 메소드를 태그 한 다음 속성이있는 메소드를 검색하고 내 코드 중 일부를 메소드 본문에 삽입하는 것입니다.

제안이 있습니까?

작업에 대한 접근 방식을 얻을 수 없다면 항상 기본 클래스 (속성과 함께)에서 가상 메소드를 사용하여 정적 공장과 결합하여 런타임 생성 방법으로 파생 된 동적 유형을 뱉어냅니다. 어린이 수업에서. 이것은 사용하기가 매우 깨끗하지 않습니다.

도움이 되었습니까?

해결책

포스트 쇼트 이는 Comcompiler이며 코드의 주입 지점을 표시하기 위해 속성을 사용하여 설명하는 것과 유사한 일을합니다. 차이는 컴파일 시간에 수행한다는 것입니다.

그러나 방법 본문을 변경하는 것이 아니라 ContextBoundObject 이는 .NET 클래스입니다. 여기에 있습니다 MSDN 잡지 기사 ContextBoundObject를 사용하여 AOP를 수행하는 방법을 설명합니다. (을 체크하다 .NET의 측면 기사의 일부)

또한 세 번째 옵션으로 속성 및 가상 메소드와 함께 동적 코드 생성 (Reflection.emit 또는 Codedom)을 사용하여 코드를 삽입 할 수있는 파생 클래스를 동적으로 생성 할 수 있지만이를 수행하는 가장 고통스러운 방법입니다.

편집하다:

사용할 예측 옵션이 있습니다 .NET 관리되지 않은 프로파일 링 API 메소드를 가로 채고 Jit-ing보다 앞서 메소드 본문을 교체합니다. 이 기술은 Justmock (Telerik)이 조롱, 정적 방법, 비 가상 방법 및 봉인 된 클래스에도 성공적으로 사용됩니다.

다른 팁

런타임에 기존 메소드를 수정할 수는 없지만 Code Dom을 즉시 생성하여 실행할 수 있습니다. 또는 코드의 문자열을 함께 연결하고 메모리로 컴파일하고 실행할 수 있습니다.

후자를 직접 수행했습니다 (메모리, 런타임으로 컴파일 및 실행 된 사용자 정의 C# 코드를 허용 한 앱).

사전 또는 사후 호출을 추가하려면 PostSharp를 살펴보십시오. http://www.postsharp.org/

다소 비슷한 질문 이전에 질문을 받았습니다 (좋아요, 내 솔루션은 다소 비슷했습니다). 포스트 쇼트 이미 언급되었지만 매우 적용 할 수 있습니다. CodeProject에 대한 Linfu 기사 문제를 연구하는 동안 흥미로운 것을 발견했습니다.

임의의 유형을 위해 이것을 할 계획입니까? 나는 당신이 속성으로 방법을 장식하지 않을 것이라고 생각하지 않을 것입니다.

이를 감안할 때, 나는 더 나은 접근 방식이 당신의 유형에 대한 슈퍼 클래스에서 추상적 인 방법을 정의하는 것이라고 생각합니다. 슈퍼 클래스의 방법은 보일러 플레이트 방법 코드를 수용하고 개별 유형의 해당 방법에 대한 추상적 인 방법을 통해 구체적인 구현에 위임 할 수 있습니다.

그러나 일반적으로, 런타임에 코드 파일을 만들고 동적 어셈블리를 컴파일하지 않는 한, 당신이 원하는 일은 할 수 없습니다. 동일한 결과에 가깝게 달성하기 위해 사용할 수있는 훨씬 더 실용적인 OO 원칙과 패턴이있을 수 있습니다.

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