Произвольный базовый метод в качестве параметра метода - 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);
}