代码之家  ›  专栏  ›  技术社区  ›  Jude Allred

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

  •  1
  • Jude Allred  · 技术社区  · 17 年前

    我一直在使用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;
            }
        }
    }
    

    不幸的是,这种方法 返回 规范化向量,而不是简单地规范化我用来调用此扩展方法的向量。我想表现得像 vector2实例 .Normalize()确实如此。

    除了使其无效之外,我如何调整它以修改“v2”? (本质上,我需要访问“this”对象,或者我需要通过引用传递“v2”。)

    编辑:

    是的,我试过这个:

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

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

    4 回复  |  直到 13 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

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

    这说明了为什么你通常应该避免使用结构。看见 this question 了解更多信息。Vector2违反了结构应该是不可变的准则,但在XNA的上下文中这样做可能是有意义的。

        2
  •  1
  •   Ryan Lundy    17 年前

    好吧,如果你真的只是 垂死的 要做到这一点,你可以做这样的事情:

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

    你可以这样称呼它:

    v2.NormalizeOrZero(ref v2);
    

    它非常丑陋,但无论如何,它都会奏效。但在这一点上,你最好首先调用一个静态方法。

        3
  •  0
  •   lomaxx    17 年前

    我不知道为什么你的第二个代码示例不起作用,但如果第一批代码做了你想做的事情,你可以简单地通过以下步骤来解决它:

    Vector2 v2 = new Vector2()
    v2 = v2.NormalizeOrZero();
    
        4
  •  0
  •   yfeldblum    17 年前

    你需要两者 ref 以及 this 对论点进行修改,这似乎不太可能奏效。