我只是想编写以下扩展方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _4Testing
{
static class ExtensionMethods
{
public static void AssignMe(this int me, int value)
{
me = value;
}
}
}
但它不起作用,我的意思是,我可以使用扩展方法来改变扩展类的值吗?我不想将void返回类型更改为int,只是更改扩展类值。提前致谢
答案 0 :(得分:5)
您的示例使用int
,这是一种值类型。类是引用类型,在这种情况下行为略有不同。
虽然您可以创建一个方法来接受AssignMe(this MyClass me, MyClass other)
之类的其他引用,但该方法可以处理引用的副本,因此如果您将other
分配给me
,它只会影响引用的本地副本。
另外,请记住,扩展方法只是伪装的静态方法。即他们只能访问扩展类型的公共成员。
public sealed class Foo {
public int PublicValue;
private int PrivateValue;
}
public static class FooExtensions {
public static void Bar(this Foo f) {
f.PublicValue = 42;
// Doesn't compile as the extension method doesn't have access to Foo's internals
f.PrivateValue = 42;
}
}
答案 1 :(得分:1)
// a work around for extension to a wrapping reference type is following ....
using System;
static class Program
{
static void Main(string[] args)
{
var me = new Integer { value = 5 };
int y = 2;
me.AssignMe(y);
Console.WriteLine(me); // prints 2
Console.ReadLine();
}
public static void AssignMe(this Integer me, int value)
{
me.value = value;
}
}
class Integer
{
public int value { get; set; }
public Integer()
{
value = 0;
}
public override string ToString()
{
return value.ToString();
}
}
答案 2 :(得分:0)
Ramon你真正需要的是扩展方法的第一个(即int me)参数的ref修饰符,但C#不允许对具有'this'修饰符的参数使用ref修饰符。
[更新]
对于值类型的扩展方法的特定情况,不可能有解决方法。如果你被允许做你想做的事,那么你要求的是“减少荒谬”;考虑C#语句:
5.AssignMe(10);
...现在你认为它的假设是什么?你想分配10到5 ??
运算符重载也无法帮助您。
答案 3 :(得分:0)
这是一篇旧文章,但我遇到了类似的问题,试图为String类实现扩展程序。
我的原始代码是:
public static void Revert(this string s)
{
char[] xc = s.ToCharArray();
s = new string(xc.Reverse());
}
通过使用new关键字我正在创建一个新对象,因为s不是通过引用传递的,所以它不会被修改。
我将其更改为以下内容,为Ramon的问题提供了解决方案:
public static string Reverse(this string s)
{
char[] xc = s.ToCharArray();
Array.Reverse(xc);
return new string(xc);
}
在这种情况下,调用代码将是:
s = s.Reverse();
要操纵整数,您可以执行以下操作:
public static int Increment(this int i)
{
return i++;
}
i = i.Increment();