2009-06-12 4 views
1

Reflection.Emit 네임 스페이스를 사용하여 필드를 제거하고 내 속성 구현으로 바꿀 수있는 방법을 찾으려고합니다. Emit을 사용하여 코드를 생성하고 IL 코드를 직접 작성하고 컴파일하는 방법에 대해 읽었지만 Reflection.Emit 네임 스페이스를 사용하여 바꾸기 또는 제거하는 방법에 대한 예제를 보지 못했습니다. 누구든지 저 줄을 따라 뭔가를 보여줄 수 있습니까?System.Reflection.Emit 네임 스페이스를 사용하여 필드를 Property로 바꿉니 까?

감사합니다.

답변

2

내 지식으로는 CLR에서는 불가능합니다. 한번로드 된 타입을 고칠 수 있다고 생각조차하지 않습니다. 속성 사용 방법에 따라 사용자 지정 TypeDescriptor (구성 요소가이를 사용하여 Windows Forms의 도구 설명 구성 요소와 같은 속성을 동적으로 확장하는 데 사용됨) 또는 DependencyProperty를 사용할 수 있습니다. 그러나로드 된 유형의 새 멤버 또는 수정 된 멤버에 대한 오래된 오래된 바인딩에 대해서는 가능하지 않다고 생각합니다.

왜 다음 메모리에 동적으로 생성 된 유형의 새로운 유형을 방출 AppDomain에 어셈블리로 로딩 DLL에 앞서로드 Assembly.ReflectionOnlyLoadFrom를 사용하고 그로드?

+0

나는 현재 통보되는 어떤 방법이없는, 또한 등 필드, 해시 테이블을 수정할 수있는 속성 그리드 형 제어 작업을하지만 해요 내 컨트롤 바깥에서 속성을 기대합니다. 따라서 사용자가 선택한 객체를 컨트롤에 설정하면 필드를 속성으로 바꾸고 알림을위한 논리를 정의하고 싶습니다 ... 긴 샷이지만이 작업을 수행 할 수있는 방법이 있습니다 ... – Thrash505

+0

IPropertyChanged는 하나의 개념입니다. http://www.msnewsgroups.net/group/microsoft.public.dotnet.languages.csharp/topic36704.aspx – eschneider

+0

선택한 개체를 가져 와서 메모리에 기반하여 새 형식을 만들고 내 사용자 지정을 구현할 수 있습니까? 그런 다음 이전 유형의 이전 연결을 끊은 다음 새 유형으로 다시 연결하십시오. TypeDescriptors 멤버를 통해보고 있었고 여러 가지 Association 메서드가 사용되는 것으로 생각했습니다. – Thrash505

1

Postsharp로 Aspect Oriented Programming을 시도해보십시오.

필자는 Postsharp를 한번도 사용하지 않았으므로 정확하게 수행 할 수있는 구체적인 아이디어가 없습니다. 그러나 이것은 Postsharp (속성이나 필드의 사전/사후 액세스를 실행하는 코드 설정)로 할 수 있다고 들었던 것과 상당히 흡사하게 들립니다. 필드, 또는이 기본적으로 아무것도 수정 될 때

http://www.postsharp.org/

+0

PostSharp를 들여다 보면 위버를 들여다보십시오. LAOS (Lightweight Aspect Oriented System)를 사용하면 기존 메서드, 속성 등에 동작을 추가 할 수 있습니다. 그러나 속성을 사용하여 필드를 바꾸려면 낮은 수준의 직조를 사용해야 할 수 있습니다. – jrista