2009-06-12 5 views
1

Я пытаюсь выяснить способ использования пространства имён Reflection.Emit, чтобы удалить поле и заменить его собственной реализацией Property. Я читал о том, как генерировать код, используя Emit, и писать и компилировать IL-код напрямую, но я не видел примеров того, как сделать замену или удаление с использованием пространства имен Reflection.Emit; Может ли кто-нибудь показать мне какие-то примеры чего-то подобного?Заменить поле с использованием пространства имен System.Reflection.Emit?

Спасибо.

ответ

2

Насколько мне известно, это невозможно в CLR. Я даже не думаю, что вы можете изменить тип после его загрузки. В зависимости от того, как вы планируете использовать свойство, вы можете использовать либо собственный TypeDescriptor (компоненты используют его для динамического расширения таких свойств, как компонент ToolTip в Windows Forms), либо вы можете использовать DependencyProperty. Но что касается простой старой связи с новым или измененным членом загруженного типа, я не думаю, что это возможно.

Почему бы не использовать Assembly.ReflectionOnlyLoadFrom для загрузки DLL до загрузки сборки в AppDomain затем излучает нового типа с динамически генерируемым типом в памяти, а затем загрузить это?

+0

Я работаю над управлением типа сетки свойство, которое также может модифицировать поля, HashTables и т.д. Но, я в настоящее время не имеют какой-либо способ уведомления, когда поле или в основном все изменяется вне моего контроля ожидаем свойств. Поэтому, когда пользователь устанавливает выделенный объект на моем элементе управления, я хочу войти и заменить поля свойством и определить некоторую логику для уведомлений ... Его длинный снимок, но есть желание сделать это ... – Thrash505

+0

IPropertyChanged - это одна концепция. http://www.msnewsgroups.net/group/microsoft.public.dotnet.languages.csharp/topic36704.aspx – eschneider

+0

Можно ли взять выбранный объект, создать новый тип, основанный на нем в памяти, реализовать мои настройки логики, затем разорвать любые старые ассоциации со старым типом, а затем повторно связать их с новым типом? Я просматривал членов TypeDescriptors, и я видел кучу методов Ассоциации ... считал, что они могут быть полезны. – Thrash505

1

Возможно, вы попытаетесь изучить Аспектно-ориентированное программирование с помощью Postsharp.

Я никогда не использовал Postsharp, поэтому у меня нет конкретных идей о том, как именно вы могли бы это сделать. Однако это действительно поразительно похоже на некоторые вещи, которые, как я слышал, вы можете делать с Postsharp (настроить код для запуска предварительного/пост-доступа свойства или поля).

http://www.postsharp.org/

+0

Если вы заглянете в PostSharp, загляните в его ткач. LAOS (облегченная система с ориентацией на аспект) позволяет добавлять поведение к существующим методам, свойствам и т. Д. Однако вам, скорее всего, понадобится использовать низкоуровневое ткачество, чтобы заменить поле свойством. – jrista