Я хотел бы сделать делегат, который вызывает специальный метод экземпляра, к сожалению, кажется, что если метод является виртуальным, вместо метода базовой версии будет вызываться переопределение метода для наследующего класса.Как я могу сделать делегат ссылкой на определенную версию метода?
public class Base{
public virtual void Method(){
Console.WriteLine("Base");
}
}
public class Child : Base{
public override void Method(){
Console.WriteLine("Child");
}
}
Если где-то в коде у меня есть следующие ::
var action = Delegate.CreateDelegate(typeof(Action<Base>), typeof(Base).GetMethod("Method")) as Action<Base>;
action(new Child());
Вывод этой программы является Child
. Мне бы очень хотелось, чтобы это было Base
. Я пробовал то же самое с деревьями выражений, и получаю тот же результат, что и испускаемый IL использует метод callvirt
. Это единственный способ сделать что-то подобное с помощью Reflection.Emit
?
Причина, по которой я прошу, заключается в том, что я использую построитель типов, чтобы переопределить поведение класса. Если бы я сам написал метод, я мог бы просто пойти base.Method()
или что-то еще, но некоторые из методов поведения могут быть определены только динамически во время выполнения, поскольку учет многих возможных случаев будет очень утомительным.
Поскольку я создаю класс, производный от Base
во время выполнения, если я пытаюсь вызвать Method()
внутри Method()
перегрузки Я делаю это приводит к бесконечной рекурсии и переполнение стека исключений. (не так хорошо, как хотелось бы).
Это для проекта стиля AOP, где я добавляю некоторую логику методам во время выполнения. Я отмечаю методы с атрибутами, тогда у меня есть построитель типов, которые создают методBuilders, который кормит тело конструктора меток с помощью дерева выражений, используя CompileToMethod(methodbuilder)
http://msdn.microsoft.com/en-us/library/dd728224.aspx, Это тонна проще, чем reflection.emit, поскольку логика нетривиальна, Я добавляю. Цель состоит в том, что у меня есть фабрика, которая выплевывает новый класс, который, когда я вызываю Method()
, сначала выполняет некоторую логику, прежде чем в конечном счете вызовет базовую реализацию.
Почему люди борются с системой типов? – ChaosPandion
Я генерирую тип во время выполнения. Мне нужен способ вызова методов в классе, из которого я получаю, я не хочу использовать 'Reflection.Emit', если я могу ему помочь? –
Опять же, что, если метод абстрактный? И если вы хотите вызвать базовый метод, почему вы их переопределяете? – jason