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