扩展方法可以修改扩展类值吗?

时间:2010-09-20 10:08:23

标签: c#-4.0 extension-methods

我只是想编写以下扩展方法:

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,只是更改扩展类值。提前致谢

4 个答案:

答案 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();