c# - 在c#中动态地将参数注入(inject)到函数调用中

标签 c# dynamic parameters

我想知道是否可以在运行时动态注入(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 将其压入堆栈。此外,我们只需将要调用的方法的签名从无参数方法替换为接受单个对象作为参数的方法。

您可以使用ildasm轻松反编译为IL并使用 ilasm 重新编译.

关于c# - 在c#中动态地将参数注入(inject)到函数调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231580/

相关文章:

c# - 并行运行时任务变慢

c# - 如何在 Xaml 值字段中设置自定义颜色值?

c# - 需要很多参数的方法

c# - 如何确保异常 "The calling thread cannot access this object because a different thread owns it"?

c# - C# 中 instagram API 中使用的时间戳时间

带类型提示的动态函数

C++动态分配二维数组

objective-c - 如何分配动态类型对象

c# - 将方法参数设置为只读

c++ - 避免过多的函数参数 : class-centered or function-centered approach?