我想知道是否可以在运行时动态注入(inject)函数参数。例如我有一个带有两个重载方法的类,例如
Class C1
{
public static void Func1(object o)
{
}
public static void Func1()
{
}
}
Class C2
{
public void Func1()
{
C1.Func1();
}
}
现在,是否可以动态地将对 Func1() 的调用替换为对重载方法 C1.Func1(object o) 的调用,并传入“this”或类型对象作为参数。
因此,当我调用 C1.Func1() 时,我的代码应该调用 C1.Func1(this);
最佳答案
我假设“动态”是指编译后解决方案,但不一定是在运行时。后者将更具挑战性,但可以做到。对于前者,如果您了解一些 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
将其压入堆栈。此外,我们只需将要调用的方法的签名从无参数方法替换为接受单个对象
作为参数的方法。
关于c# - 在c#中动态地将参数注入(inject)到函数调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231580/