2012-09-05 53 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'委托类型,但我不确定这是你想要的。 –