2010-08-30 3 views
1

У меня здесь есть головоломка, и я даже не уверен, что это возможно.Использование динамического класса/свойств во время выполнения для загрузки конфигурации

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

Предположим, у нас есть 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, а у них быть динамичными и возвращаемой при вызове при ,

Похоже на протяжение, но это вообще возможно?

ответ

3

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

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

+1

Это тот! – Timwi

+0

+1 @Timwi, не хотел наступать на ваши динамические пальцы ног, я предположил, что вы имели в виду DynamicObject, но IDynamicObject (который, я считаю, заменен IDynamicMetaObjectProvider, хотя я не мог найти краткую документацию об этом факте) не для слабых сердца и попытки реализовать GetMetaObject сложнее и универсальнее, чем требуется для любой цели, помимо написания библиотеки/фреймворка. – marr75

+0

Вау! Это именно то, что мне нужно. Огромное спасибо! –

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