[英]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
作為參數的方法即可。
您可以使用擴展方法:
public static class C1Extensions
{
public static void Func1(this C1 o)
{
// ...
}
}
public class C1
{
public void Foo()
{
this.Func1();
}
}
由於您的方法是靜態的,因此無法獲取調用對象。
您可以選擇使方法成為非靜態方法並創建一個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.