Я предполагаю, что под "динамическим" вы подразумеваете решение после компиляции, но не обязательно во время выполнения. Последнее будет более сложным, но может быть сделано. Для первых это довольно легко, если вы знаете какой-нибудь IL. Я отмечаю, что C2.Func1
компилируется во что-то вроде
.method public hidebysig instance void Func1() cil managed {
call void SomeNamespace.C1::Func1()
ret
}
, который вы можете легко заменить на
.method public hidebysig instance void Func1() cil managed {
ldarg.0
call void SomeNamespace.C1::Func1(object)
ret
}
Это потому, что нулевой аргумент в методе экземпляра всегда является ссылкой this
для текущего экземпляра, и мы можем поместить его в стек с помощью инструкции ldarg.0
. Более того, мы просто заменяем сигнатуру метода, который мы вызываем из метода без параметров, на метод, принимающий в качестве параметра один object
.
Вы можете легко декомпилировать в IL, используя ildasm
, и перекомпилировать, используя ilasm
.