2010-11-20 2 views
3

Я использую стороннюю библиотеку для выполнения некоторой работы. Я передаю объект в lib и выполняю некоторые действия над каждым свойством объекта. Он перечисляет свойства с использованием отражения. Вот как это реализовано, и я не могу его изменить.Как добавить свойства объекта во время выполнения в .net?

Я не знаю, какие и сколько свойств должно обрабатывать lib во время компиляции. Эта информация доступна только во время выполнения. Поэтому я не могу создать объявление класса в своем исходном коде.

Кажется dynamic особенность .net4 не может мне помочь, потому что lib использует отражение, а не динамику.

На самом деле я могу видеть только два варианта здесь:

  1. создать огромное определение класса, как это:

    class Data 
    { 
        public object P1 {get; set;} 
        public object P2 {get; set;} 
        .... 
        public object PN {get; set;} // N should be at least 10.000 
    } 
    
  2. Генерировать определение класса во время выполнения и использовать CSharpCodeProvider скомпилировать его использовать.

Можете ли вы предложить мне другие варианты?

И, к сожалению, я не могу заменить этот lib другим.

+0

могли бы вы предоставить более подробную информацию о Lib вы используете? – arul

ответ

2

Использование первого подхода приведет к высокому потреблению памяти. Я бы выбрал использование класса TypeBuilder для создания новых типов во время выполнения.

2

То, что вы ищете, называется Property Bag. Возможно, вы сможете реализовать что-то вроде этого, используя ICustomTypeDescriptor, чтобы выявить дополнительные метаданные (при условии, что ваша библиотека поддерживает его).

Если ваша библиотека потребления использует Reflection напрямую (и не использует возможности конструктора, такие как дескрипторы типов), то лучшим вариантом является, вероятно, динамическая генерация прокси-оболочки с дополнительными свойствами. Castle DynamicProxy - один хороший способ сделать это.


EDIT:

На самом деле, я не уверен, что если замок поддерживает добавление новых свойств объекта прокси. Вы можете застревать с помощью IL Emit напрямую через TypeBuilder. Это нетривиально, так как вам нужно будет достаточно узнать об IL Emit для генерации аксессуаров свойств, и есть немного кривая обучения. Тем не менее, это интересный и забавный материал и стоит того, если у вас есть время.

1

Я думаю, что это обычный элемент графического интерфейса, например Grid или PropertyGrid.

Тогда я бы начал с отражения метода сетки, которые принимают экземпляр класса в качестве параметра, и если это возможно, заполните внутренний словарь или словарь с моими собственными значениями.

Если это невозможно, вместо Emit, попробуйте использовать System.CodeDom: http://blogs.msdn.com/b/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx

Смежные вопросы