我在哪里放置扩展方法?

时间:2011-07-17 16:30:04

标签: c# .net extension-methods

这里的高级成员给了我这段代码:

public static string Truncate(this string value, int maxChars)
{
    return value.Length <= maxChars ? value : value.Substring(0, maxChars) + " ..";
}

他说要用它作为扩展方法。但是我在哪里放这个方法呢?看起来它为.Net增加了一些东西

4 个答案:

答案 0 :(得分:36)

考虑一个名为StringExtensions的类,如下所示:

static class StringExtensions {
    public static string Truncate(this string value, int maxChars) {
        return value.Length <= maxChars ? 
               value : 
               value.Substring(0, maxChars) + " ..";
    }
}

确保无论您将此类放入哪个命名空间,都要为该命名空间包含using声明。

因此,举一个完整的例子:

StringExtensions.cs

namespace My.Extensions {
    static class StringExtensions {
        public static string Truncate(this string value, int maxChars) {
            return value.Length <= maxChars ?
                   value :
                   value.Substring(0, maxChars) + " ..";
        }
    }
}

Program.cs

using System;
using My.Extensions;

namespace My.Program {
    static class Program {
        static void Main(string[] args) {
            string s = "Hello, World";
            string t = s.Truncate(5);
            Console.WriteLine(s);
            Console.WriteLine(t);
        }
    }
}

顺便说一下,你没有将它添加到.NET。您甚至没有向类String添加新方法。相反,它是一个编译器技巧,使静态方法生成在静态类中,其第一个参数声明为this *TypeName* *valueParameter*,其中*TypeName*是类型的名称,*valueParameter*是参数的名称可以使其在类型名为*TypeName*的类型的实例上显示为实例方法。那是

string t = s.Truncate(5);

由编译器翻译成

string t = StringExtensions.Truncate(s, 5);

答案 1 :(得分:2)

将其置于静态类中,并在其命名空间上使用 using

e.g。

namespace Foo
{
    static class Extensions
    {
        public static string Truncate(this string value, int maxChars)
        {
            return value.Length <= maxChars ?
                value : value.Substring(0, maxChars) + " ..";
        }
    }
}

然后在不同的文件中

using Foo;  //Don't forget this!

class Tester
{
    static void Test()
    {
        Console.WriteLine("123456".Truncate(3));
    }
}

答案 2 :(得分:0)

是的,使用静态类。我组织一个单独的项目,我可以跨解决方案使用。我还根据我正在扩展的内容(如字符串,枚举,io,日期时间等)组织单独的文件

答案 3 :(得分:0)

除了其他答案:是的,它是一种扩展的.NET。更严格地说,扩展已编译的类。您可以向无法进行修改的类“添加”方法。从内部的角度来看,它只是一种语法糖:你的方法不能通过反思看出来。但对于扩展的用户来说,看起来好像这些方法确实被添加到了目标类中(好吧,有一些区别)。

以某种方式影响已编写代码的可能性是面向对象方法的重要组成部分。在几乎任何OO语言中,您都可以派生自某些现有类,并以这种方式添加一些功能(尽管这不是代码重用的首选方式)。在Objective C中,您可以在编译时使用 categories 修改现有类。在JavaScript中,您甚至可以在运行时使用 prototype 修改它们。

由于C#不是像JavaScript那样的动态语言,因此可以通过一种有限的扩展方法来修改现有的类。