Произвольный базовый метод в качестве параметра метода - C#

Узнай цену своей работы

Формулировка задачи:

Не знаю, возможно ли, но вдруг какие-нибудь идеи подскажете. Стандартными подходами через MethodInfo.Invoke и делегаты не получается реализовать задуманное. В первом случае вызывается не базовый метод, а переопределённый, что приводит к бесконечной рекурсии, а в случае с делегатом не нашёл возможности описать делегат для вызова произвольного метода. Ограничения: - базовый класс "BaseUnit" не должен модифицироваться. - метод "Common.MethodCall" должен быть один и подходить для вызова методов с любыми сигнатурами. Знаками вопроса отмечены три места, где у меня возникли затруднения.
Листинг программы
  1. public sealed class Common
  2. {
  3. //Сюда нужно как-то передать целевой метод и объект, для которого он вызывается.
  4. //Если передать 'this' и MethodInfo (метода базового класса), то
  5. //по Invoke вызов снова уходит в переопределённый метод (рекурсия).
  6. public object MethodCall(??? baseMethod, object[] parameters)
  7. {
  8. //...
  9. object result = baseMethod(parameters);
  10. //...
  11. return result;
  12. }
  13. }
Листинг программы
  1. public class BaseUnit
  2. {
  3. public virtual bool DoSome()
  4. {
  5. return true;
  6. }
  7. public virtual string DoOther(int index)
  8. {
  9. return string.Empty;
  10. }
  11. }
Листинг программы
  1. public class NextUnit : BaseUnit
  2. {
  3. private Common common;
  4. public NextUnit(Common common)
  5. {
  6. this.common = common;
  7. }
  8. public override bool DoSome()
  9. {
  10. return (bool)common.MethodCall(???base.DoSome???, null);
  11. }
  12. public override string DoOther(int index)
  13. {
  14. return (string)common.MethodCall(???base.DoOther???, new object[] { index } );
  15. }
  16. }
Листинг программы
  1. static void Main(string[] args)
  2. {
  3. BaseUnit unit = new NextUnit(new Common());
  4. unit.DoSome();
  5. unit.DoOther(42);
  6. }

Решение задачи: «Произвольный базовый метод в качестве параметра метода»

textual
Листинг программы
  1.       var items = Enumerable.Range(0, 100).ToList();
  2.       for (int i = 0; i < 1000000; i++)
  3.       {
  4.         type.Sort(items);
  5.         type.Reverse(items);
  6.       }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы