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

Posted

技术标签:

【中文标题】如何在 C#.Net 中创建原型方法(如 JavaScript)?【英文标题】:How can I create Prototype Methods (like JavaScript) in C#.Net? 【发布时间】:2010-09-05 11:58:39 【问题描述】:

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

javascript 中,我可以执行以下操作来为字符串对象创建一个 trim 方法:

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

如何在 C#.Net 中执行此操作?

【问题讨论】:

【参考方案1】:

您不能动态地将方法添加到 .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);

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

【讨论】:

感谢 Lassevk,很好的回答 :) 回应“你到底想要完成什么?”。时不时地,我需要操作字符串或其他对象。不必调用函数来执行此操作,我认为将其作为方法调用会更好。我目前正在用 Asp.net 编写 Web 应用程序,但我认为还没有 Asp.net 3.x,所以我现在必须等待。不过谢谢你的回答。【参考方案2】:

听起来您在谈论 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”参数之后)都被视为普通参数。

【讨论】:

【参考方案3】:

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

public static string MyMethod(this string input)

    // do things

你可以这样称呼它

"asdfas".MyMethod();

【讨论】:

【参考方案4】:

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

public static void Trim(this string s)

  // implementation

您可以通过包含此 hack 在 CLR 2.0 目标项目(3.5 编译器)上使用它:

namespace System.Runtime.CompilerServices

  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  
  

【讨论】:

以上是关于如何在 C#.Net 中创建原型方法(如 JavaScript)?的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 中创建 C++ ATL COM 嵌套命名空间,如 System 命名空间

我将如何在 c 中创建一个输出流,如 stdout?

如何在 Xcode 中创建我的应用程序的新版本?

js中创建对象方式----原型模式

如何在 .NET 中创建虚拟网络适配器?

如何在C中创建线程的被动等待FIFO?