Произвольный базовый метод в качестве параметра метода - 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д