提问人:GateKiller 提问时间:8/7/2008 最后编辑:StuartLCGateKiller 更新时间:12/17/2014 访问量:10947
如何在 C#.Net 中创建原型方法(如 JavaScript)?
How can I create Prototype Methods (like JavaScript) in C#.Net?
问:
如何在 C#.Net 中制作原型方法?
在 JavaScript 中,我可以执行以下操作来为 string 对象创建 trim 方法:
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
如何在 C#.Net 中执行此操作?
答:
0赞
David Wengier
8/7/2008
#1
需要创建一个扩展方法,该方法需要 .NET 3.5。该方法必须是静态的,在静态类中。该方法的第一个参数需要在签名中以“this”为前缀。
public static string MyMethod(this string input)
{
// do things
}
然后你可以这样称呼它
"asdfas".MyMethod();
22赞
Lasse V. Karlsen
8/7/2008
#2
不能将方法动态添加到 .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赞
GateKiller
8/7/2008
谢谢 Lassevk,很棒的答案:)在回答“你到底想完成什么?时不时地,我需要操作字符串或其他对象。与其调用函数来执行此操作,我认为最好将其称为方法。我目前正在用 Asp.net 编写 Web 应用程序,我认为还没有 3.x Asp.net,所以我现在必须等待。但谢谢你的回答。
0赞
Andrew Peters
8/7/2008
#3
使用 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
{
}
}
5赞
Matt Hamilton
8/7/2008
#4
听起来你在谈论 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”参数之后)都被视为正常参数。
评论