Использование динамического класса / свойств во время выполнения для загрузки конфигурации - PullRequest
1 голос
/ 30 августа 2010

У меня тут загадка, и я даже не уверен, что это возможно.

Я разрабатываю приложение на основе плагинов, в котором все плагины будут иметь доступ (чтение / запись) к общей конфигурации приложения хоста. Существуют более простые способы решения проблемы, которую я представляю, но, поскольку это не связанный с работой проект, я могу поиграть:)

Допустим, у нас есть Plugin_A, который наследует PluginBase абстрактный класс. Абстрактный класс предоставляет свойство IConfiguration Config, к которому плагин может получить доступ для записи в эту общую конфигурацию. IConfiguration Config правильно устанавливается хостом при загрузке плагина, чтобы ограничить доступную конфигурацию, к которой будет обращаться конкретный плагин.

Я хотел бы попробовать использовать ключевое слово Dynamic в C # 4.0, чтобы без проблем написать класс конфигурации.

в псевдо-коде C # вот чего я хотел бы достичь

public class Plugin_A: PluginBase
{
   public void DoSomethingWithConfig()
   {
      ShowAMessageBox(Config.SomeMessage);
      Config.HasShownMessage = true;
   }
}

Теперь - в этом примере я не хочу фактически определять .SomeMessage и .HasShownMessage, а хочу, чтобы они были динамическими и возвращались при вызове.

Это кажется натяжкой, но возможно ли это вообще?

1 Ответ

3 голосов
/ 30 августа 2010

Я не думаю, что вы хотите реализовать интерфейс IDynamicObject, я рекомендую вместо этого использовать наследование Config от DynamicObject.Вы хотите переопределить TryGetMember и TrySetMember по крайней мере для вашего примера.TryInvokeMember будет необходимо, если вы хотите динамически вызывать методы.Реализовать весь интерфейс намного сложнее.

Итак, ваш класс (ы) конфигурации должен унаследовать DynamicObject и реализовать IConfiguration.Затем вы можете объявить поле как динамический элемент или как объекты IConfiguration и привести их динамически, прежде чем захотите использовать их динамическое поведение.

...