據我所知,沒有辦法與表達式樹中的引用類型進行交互。 (例如沒有發出stind.*
或ldind.*
操作碼)。 我正在研究一些重寫器來解決這個問題。由於我構建了一個新的類型,其方法體已由委託調用取代(以解決CompileToMethod
只能執行不能與新成員交互的靜態方法的事實)。對於by-ref和out參數,我想我會用StrongBox<T>
來替換它們的用法。使用IL分配給ref的字段是否合法?
所以,如果我碰到有看起來像這樣::一個簽名的方法來
public class SomeClass
{
public virtual bool SomeMethod(string arg1,ref int arg2)
{
}
}
的倍率,該callbase方法,並委託我場產生看起來像這樣::
public class SomeClass<1> : SomeClass
{
private static bool SomeMethod<0>(
SomeClass target,string arg1,StrongBox<int> arg2)
{
return call target.SomeMethod(arg1,ref arg2.Value)
}
private Func<SomeClass,string,StrongBox<int>,bool> <0>SomeMethod;
public override bool SomeMethod(string arg1,ref int arg2)
{
StrongBox<int> box = new StrongBox<int>();
box.Value = arg2;
bool retVal = <0>SomeMethod.Invoke(this,arg1,box);
arg2 = box.Value;
return retVal;
}
}
但是,這是相當多的代碼來執行此轉換,對於每個參數它引入了很多複雜性。當我執行box.Value = arg2
的設置時,如果我可以執行類似&box.Value = &arg2
這樣的操作,它會將地址分配給arg2的地址。這樣,當委託在值字段上執行變更時,變更就會被轉發。這樣做意味着我不需要有一個變量來保存返回值,並且我不需要執行參考值更新。
或者,如果有一種方法可以通過表達式樹來執行帶引號分配的語義,當然,我都是耳朵。
這讓我想起了Eric Lippert的[Ref Class](http://stackoverflow.com/questions/2980463/how-do-i-assign-by-reference-to-a-class-field-in-c/2982037#2982037)。 – Brian 2010-12-06 17:14:57