簡體   English   中英

將參數動態注入到C#中的函數調用中

[英]Dynamically injecting a parameter into a function call in c#

我想知道是否有可能在運行時動態注入函數參數。 例如,我有一個帶有兩個重載方法的類,例如

Class C1
{
    public static void Func1(object o)
    {
    }

    public static void Func1()
    {
    }       
}

Class C2
{

    public void Func1()
    {
       C1.Func1();
    }
}

現在,可以用傳入“ this”或類型對象作為參數的對重載方法C1.Func1(object o)的調用來動態替換對Func1()的調用。

因此,在影響當我調用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指令將其壓入堆棧。 此外,我們只需將要調用的方法的簽名從無參數方法替換為接受單個object作為參數的方法即可。

您可以使用ildasm輕松地將其反編譯為IL並使用ilasm重新編譯。

您可以使用擴展方法:

public static class C1Extensions
{
    public static void Func1(this C1 o)
    {
        // ...
    }
}

public class C1
{
    public void Foo()
    {
       this.Func1();
    }
}

幾種選擇:

  1. 將二進制文件反編譯為MSIL,手動進行更改,然后重新編譯。
  2. 使用.NET概要分析API來注入代碼,這是討論它的[文章]。
  3. c相似的問題代碼注入

代碼注入將是在沒有參數的情況下攔截函數,並在有參數的情況下調用函數。

由於您的方法是靜態的,因此無法獲取調用對象。

您可以選擇使方法成為非靜態方法並創建一個C1對象,或者將C2(此)對象作為參數傳遞。

您是否考慮過使用擴展方法來做到這一點?

public static class C1WrappingExtensions {
    public static void Func1(this object instance) {
        C1.Func(instance);
    }
}

// Now you can just call Func1() on any object...
var me = new Whatever();
me.Func1();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM