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

Gat*_*ler 18 .net c#

如何在C#.Net中制作原型方法?

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

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

我怎样才能在C#.Net中这样做?

ang*_*son 22

除非通过更改该类的源,否则无法将方法动态添加到.NET中的现有对象或类.

但是,您可以在C#3.0中使用扩展方法,它们看起来像新方法,但是编译时魔术.

为您的代码执行此操作:

public static class StringExtensions
{
    public static String trim(this String s)
    {
        return s.Trim();
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

String s = "  Test  ";
s = s.trim();
Run Code Online (Sandbox Code Playgroud)

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

String s = "  Test  ";
s = StringExtensions.trim(s);
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*ton 5

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

public static class MyStringEtensions
{
    public static bool ContainsMabster(this string s)
    {
        return s.Contains("Mabster");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

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

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