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

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

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

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

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

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

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


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

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

12   голосов , оценка 4.167 из 5
Похожие ответы