提问人:Jude Allred 提问时间:11/20/2008 最后编辑:Jude Allred 更新时间:4/3/2013 访问量:1515
如何从 C# 扩展方法中访问“this”?
How do I access 'this' from within a C# extension method?
问:
我一直在使用 Vector2 和 XNA,我发现在零向量上调用 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 范围内的一个变量。
答:
0赞
lomaxx
11/20/2008
#1
我不确定为什么你的第二个代码示例不起作用,但如果第一批代码做了你想要的,你可以简单地通过以下方式解决它:
Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();
评论
0赞
Servy
4/3/2013
第二个代码示例是改变结构的副本,因此虽然它在某种意义上有效,但它并没有执行 OP 希望它执行的操作,而是更改了对象调用者所拥有的。
3赞
Daniel Plaisted
11/20/2008
#2
这是行不通的,因为 Vector 2 实际上是一个结构体。这意味着它是按值传递的,并且无法修改调用方的副本。我认为您能做的最好的事情是 lomaxxx 指定的解决方法。
这说明了为什么通常应避免使用结构。有关详细信息,请参阅此问题。Vector2 违反了结构应该是不可变的准则,但在 XNA 的上下文中这样做可能是有意义的。
0赞
yfeldblum
11/20/2008
#3
您需要在参数上同时使用 和 修饰符,这似乎不太可能起作用。ref
this
1赞
Ryan Lundy
11/20/2008
#4
好吧,如果你真的只是想做这件事,你可以做这样的事情:
public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
if (v2 != Vector2.Zero)
v2.Normalize();
}
你可以这样称呼它:
v2.NormalizeOrZero(ref v2);
它非常丑陋,但它会起作用,物有所值。但此时,您不妨首先调用静态方法。
评论