如何从C#扩展方法中访问“this”?

时间:2008-11-20 01:07:40

标签: c# pass-by-reference this

我一直在使用Vector2和XNA,我发现调用Zero Vector上的Normalize()成员函数将其规范化为{NaN,NaN}的向量。这一切都很好,但在我的情况下,我更喜欢它,而只是将它们留作零矢量。

将此代码添加到我的项目中启用了一个可爱的扩展方法:

using ExtensionMethods;

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static Vector2 NormalizeOrZero(this Vector2 v2)
        {
            if (v2 != Vector2.Zero)
                v2.Normalize();
            return v2;
        }
    }
}

不幸的是,这个方法返回规范化的向量,而不是简单地规范化我用来调用这个扩展方法的向量。我想改为行为 vector2Instance .Normalize()。

除了使这个空白之外,我该如何调整它以便修改'v2'? (基本上,我需要访问'this'对象,或者我需要'v2'通过引用传递。)

编辑:

是的,我试过这个:

    public static void NormalizeOrZero(this Vector2 v2)
    {
        if (v2 != Vector2.Zero)
            v2.Normalize();
    }

不起作用,v2只是NormalizeOrZero范围内的一个变量。

4 个答案:

答案 0 :(得分:3)

这不起作用,因为Vector 2 is actually a struct。这意味着它按值传递,您无法修改调用者的副本。我认为你能做的最好的是lomaxxx指定的解决方法。

这说明了为什么通常应该避免使用结构。有关详细信息,请参阅this question。 Vector2违反了结构应该是不可变的准则,但在XNA的上下文中这样做可能是有意义的。

答案 1 :(得分:1)

好吧,如果你真的只是正在死去这样做,你可以这样做:

public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
    if (v2 != Vector2.Zero)
        v2.Normalize();
}

你会这样称呼它:

v2.NormalizeOrZero(ref v2);

它非常丑陋,但它会起作用,因为它的价值。但是在那时你也可以首先称之为静态方法。

答案 2 :(得分:0)

我不确定为什么你的第二个代码示例不起作用,但如果第一批代码完成了你想要的东西,你可以简单地解决它:

Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();

答案 3 :(得分:0)

您需要在参数上同时使用refthis修饰符,这似乎不太可行。