Динамически скомпилируйте фрагмент кода и добавьте его в текущий класс

Я хочу создать несколько свойств на лету внутри конструктора класса и добавить их в текущий класс. Шаблон свойства следующий

public [PropertyType] [PropertyName]
{
get {return Container.Resolve();}
}

Я немного читал о CodeDom и Reflection.Emit, но не смог понять, как их использовать в этом конкретном случае.

Любая подсказка будет принята с благодарностью. заранее спасибо

РЕДАКТИРОВАТЬ: я уточняю цель из-за количества вопросов... Я пытаюсь реализовать базовый класс для локатора модели представления. Привязка в xaml достигается путем обращения к свойству по его пути, поэтому оно ДОЛЖНО быть свойством. Типы и имена добавляемых свойств известны только во время выполнения, поэтому для их получения я использую отражение. Короче говоря, мне нужен пример взятия фрагмента кода и его динамической компиляции в заданный класс.


person user759141    schedule 12.06.2011    source источник
comment
Как будет работать этот звонок? Вы забыли добавить параметр к Resolve()?   -  person svick    schedule 12.06.2011
comment
Метод Resolve() будет работать без параметров. тут дело не в этом...   -  person user759141    schedule 12.06.2011
comment
Почему вы хотите добавить свойства в класс? Чтобы вызвать их, вам нужно использовать отражение. И если вы используете отражение, то почему бы вам не использовать его, чтобы просто выполнить нужный контент в этом получателе свойств?   -  person CodesInChaos    schedule 12.06.2011
comment
Я понимаю, что вопрос не в этом, но мне любопытно: как вы собираетесь Resolve() работать? Если вы хотите использовать что-то вроде StackTrace, это не сработает из-за встраивания.   -  person svick    schedule 12.06.2011
comment
На самом деле, это сработало. Я именно так и реализовал   -  person user759141    schedule 12.06.2011
comment
В отладочных сборках это будет работать. В сборке Release, скорее всего, это не сработает.   -  person svick    schedule 12.06.2011
comment
Он работает даже в режиме Release. Только что проверил :)   -  person user759141    schedule 12.06.2011


Ответы (4)


Если вы используете C# 4, вы можете использовать для этого новые динамические функции. Используйте ExpandoObject или DynamicObject, чтобы динамически добавлять свойства к вашему объекту. Если вы затем обратитесь к ним в XAML, они будут правильно разрешены.

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

person svick    schedule 12.06.2011
comment
у вас есть какой-нибудь пример кода для расширения этого подхода? - person user759141; 12.06.2011
comment
Который из? Использование С# 4 и динамических объектов или динамическое создание нового класса? - person svick; 12.06.2011
comment
большое спасибо за подсказку. Это действительно помогает. Мне даже не нужно было создавать новый класс, я просто сделал существующий класс наследником DynamicObject. Теперь код намного чище - person user759141; 12.06.2011

альтернативный подход:

вы можете реализовать ICustomTypeDescriptor и предоставить дополнительные свойства

ссылка: Проблема с привязкой данных Grid

person DarkSquirrel42    schedule 12.06.2011

Привяжите свой материал xaml к чему-то вроде xml и измените xml во время выполнения.

person Navid Rahmani    schedule 12.06.2011
comment
В таком случае Container.Resolve() не будет работать. Ограничение свойства является ЖЕСТКИМ. - person user759141; 12.06.2011

Вы можете создать новый класс и наследовать его от текущего класса, новый класс может иметь свойства «на лету» и функциональность базового класса.

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

person DeveloperX    schedule 12.06.2011
comment
Можно ли создать новые свойства в одном классе? - person user759141; 12.06.2011
comment
ответы, на которые вы ссылаетесь, ничего не добавляют к существующему классу. - person svick; 12.06.2011