考虑以下方法示例:
public static string[] ParseOptions()
{
return Environment.GetCommandLineArgs();
}
我需要做些什么来创建一个扩展,使ParseOptions()以小写形式返回所有命令行参数?
我希望能够按如下方式使用扩展名:
var argArray = ParseOptions().MyExtToLower();
注意:我要求此更好地了解如何为方法创建扩展。我真的不想以这种方式获得小写命令行参数。
答案 0 :(得分:4)
public static string[] MyExtToLower(this string[] source)
{
for (int i = 0; i < source.Length; i++)
{
source[i] = source[i].ToLower();
}
return source;
}
请注意参数列表中的this
关键字。这就是调用这样的方法的原因:
var argArray = ParseOptions().MyExtToLower();
要明确的是,您实际上并未在此处为方法添加扩展名。你正在做的是为方法返回的类型添加扩展名。
答案 1 :(得分:2)
您似乎在谈论Fluent Interfaces。看看这个例子 - http://blog.raffaeu.com/archive/2010/06/26/how-to-write-fluent-interface-with-c-and-lambda.aspx
或者,您可以对要返回的类型(在您的情况下为string[]
)创建扩展方法以获取方法链接 - http://msdn.microsoft.com/en-us/library/bb383977.aspx
答案 2 :(得分:1)
对于您描述的语法,您必须扩展String []或可能IEnumerable&lt; String&gt;以下方式:
public static class MyExtensions {
public static String[] MyExtToLower(this String[] strings) {
return strings.Select(s => s.toLower()).ToArray();
}
public static IEnumerable<String> MyExtToLower(this IEnumerable<String> strings) {
return strings.Select(s => s.toLower());
}
}
答案 3 :(得分:1)
您不创建方法的扩展,您可以创建扩展对象功能的方法。这些方法必须是静态的,并且是静态类的一部分。它们必须有一个标有this
关键字的参数,以指示要扩展的对象。在您的情况下,您必须写下如下内容:
// the class must be static, I usually declare a class reserved for extension method.
// I mark it as partial so that I can put every method in the same file where I use it.
public static partial class Extension {
// This is the extension method; it must be static. Note the 'this' keyword before
// the first parameter: it tells the compiler extends the string[] type.
public static MyExtToLower( this string[ ] args ) {
// your code
}
}
请注意,您无法覆盖实例方法。尽管如此,您可以使用与实例方法具有相同签名的方法,由于编译器绑定的方式,该方法永远不会被调用。