我如何在C#.Net中创建原型方法(如JavaScript)?

如何在C#.Net中创建原型方法?

在JavaScript中,我可以执行以下操作为字符串对象创建修剪方法:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}

我怎么能在C#.Net中做这件事?

0

4 答案

使用3.5编译器,您可以使用扩展方法:

public static void Trim(this string s)
{
  // implementation
}

你可以在CLR 2.0目标项目(3.5编译器)上使用它,通过包括这个黑客:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
0
额外

您不能动态地将方法添加到.NET中的现有对象或类,除非更改该类的源代码。

但是,您可以在C#3.0中使用扩展方法,它们像新方法一样 ,但却是编译时魔术。

为你的代码做到这一点:

public static class StringExtensions
{
    public static String trim(this String s)
    {
        return s.Trim();
    }
}

要使用它:

String s = "  Test  ";
s = s.trim();

这看起来像一个新的方法,但将编译与此代码完全相同的方式:

String s = "  Test  ";
s = StringExtensions.trim(s);

你究竟想要完成什么?也许有更好的方法来做你想做的事情?

0
额外
谢谢Lassevk,很好的回答:)回应“你到底想要完成什么?”。每一次,我都需要操纵一个字符串或其他对象。与其不必为此调用某个函数,我会认为将它称为一种方法会更好。我目前在Asp.net上写Web应用程序,但我不认为有Asp.net 3.x,所以我现在得等一等。但谢谢你的回答。
额外 作者 GateKiller,

这听起来像你在谈论C#的扩展方法。通过在第一个参数前插入“this”关键字,可以为现有类添加功能。该方法必须是静态类中的静态方法。 .NET中的字符串已经有了一个“Trim”方法,所以我会用另一个例子。

public static class MyStringEtensions
{
    public static bool ContainsMabster(this string s)
    {
        return s.Contains("Mabster");
    }
}

所以现在每个字符串都有一个非常有用的ContainsMabster方法,我可以这样使用它:

if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ }

请注意,您也可以将扩展方法添加到接口(例如IList),这意味着实现该接口的任何类也将采用该新方法。

您在扩展方法中声明的任何额外参数(在第一个“this”参数之后)被视为正常参数。

0
额外

您需要创建一个需要.NET 3.5的扩展方法。该方法在静态类中需要是静态的。该方法的第一个参数需要在签名中加上“this”作为前缀。

public static string MyMethod(this string input)
{
    // do things
}

你可以这样称呼它

"asdfas".MyMethod();
0
额外