2012-09-05 51 views
1

是否可以在靜態擴展方法中修改this/focus變量?訪問擴展方法的變量(C#)

例如:

public static class AnimExtensions 
{ 
    public static int anim(this float f, float to, float time) 
    { 
     return Animation.Start(a => f = a, f, to, time); 
    } 
} 

我想使用擴展漂浮到調用Animation.Start方法,通過使用關於「這個」變量lambda函數。這個關鍵字在擴展方法中是不允許的,但是有沒有另外一種方式來訪問/使用這種方式的變量?

+4

儘管如此?沒有人能夠訪問'f'。 – ChaosPandion

+0

如果您需要調用上下文,請使用該擴展參數。 – asawyer

+0

@ChaosPandion - 這個想法是,正在執行的變量將被修改,允許我打電話,如:someFloat.anim(endVal,time);而不必編寫Animation.Start(a => someFloat = a,someFloat,endVal,time); – damocles

回答

8

您當然可以修改該參數 - 但它不會產生任何效果,因爲按照常規方法按值傳遞參數。

您不能將擴展方法的第一個參數聲明爲refout,這是它需要的效果。

1

我不確定你在問什麼。 Animation.Start方法的第一個參數的類型是什麼?

類型floatSystem.Single)是不變所以你不能修改f對象。您可以將f分配給一個新對象(例如f = 3.14F;f++;),但Jon Skeet在他的回答中解釋說,這是無用的(ref/out不能與this合併)。

如果您在可變引用類型的擴展方法,說List<>,那麼它可能修改「此」對象,如:

public static void AbsAll(this List<float> list) 
{ 
    for (int i = 0; i < list.Count; ++i) 
    list[i] = Math.Abs(list[i]); 
} 

它仍然不會是有用的當然,將list分配給一個新對象。

+0

開始方法的第一種類型是動作,我認爲這是對我而言一切都崩潰的地方。我想動畫浮動,但這樣做沒有長時間的函數調用,但它看起來像我堅持更詳細的方法。 – damocles

+0

不知道我明白,但類型動作'沒有'ref'修飾符的唯一參數。它說'T obj',它不會說'ref T obj'。請參閱[文檔](http://msdn.microsoft.com/en-us/library/018hxwa8.aspx)。你可以創建自己的'RefAction'委託類型,但我不確定這是你想要的。 –