2013-08-01 5 views
1

Мне нужен совет по наилучшему способу имитации множественного наследования для класса C#, который необходимо расширить с поддержкой динамики.Реализация функциональности DynamicObject для класса, который расширяет другой класс

У меня есть класс MainClass, который не должен зависеть от DLR - все его свойства и методы статически компилируются. В нем много перегруженных операторов. Это своего рода DSL.

ExtendedClass - это в основном MainClass с поддержкой динамики C#, например. в дополнение ко всем функциям MainClass необходимо перегрузить TryGetMember/TryInvokeMember DynamicObject, чтобы клиенты могли использовать его с расширенными свойствами, оцененными во время выполнения.

Здесь возникает проблема, связанная с тем, что DynamicObject является классом, а не интерфейсом. Поэтому ExtendedClass должен выводиться только из DynamicObject, что означает, что он должен в основном дублировать все функции MainClass.

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

ответ

1

Трудно сказать с таким очень общим описанием. Общая картина Я знаком с является:

public class MainClass{ 
     foo bar(); 
     more stuff {get;set;} 
     .... 
} 

public class ExtendedClass:MainClass{ 
     protected class Helper:DynamicObject{ ...} 
     private Helper _helper; 
     public Extended(){ 
      _helper= new Helper(this); 
     } 

     public dynamic Extend { 
     get{ return _helper}; 
     } 
} 

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

+0

Но я смотрю сейчас на IDynamicMetaObjectProvider, не решает ли эта проблема? Согласно документам, это точный случай, когда я могу добавить динамику в класс, который наследуется от другого класса. –

+0

Это, но много работы. Если вы хотите спуститься по этой дороге, меня полностью интересует результат. – jbtule

+0

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

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