分部类与扩展方法

本文关键字:扩展 方法 | 更新日期: 2023-09-27 17:56:28

我没有太多使用这两种方法来扩展类或针对类创建扩展方法的经验。通过查看其他人的工作,我在这里有一个问题。

我看到人们使用分部类来扩展项目中的实体类。同时,在同一项目中,还有另一个文件夹,其中包含实体类的大量扩展方法。

这样做对吗?我的意思是这两种方式都很好用。您能给我一些真正的想法,当我想要扩展类时如何选择一个或另一个吗?

分部类与扩展方法

决定是

要使用分部类还是扩展方法的一些差异是

分部类

  • 仅适用于同一项目/程序集中的类
  • 目标类必须标记为部分
  • 有权访问目标类的字段和受保护的成员
  • 目标必须是类实现

扩展方法

  • 可以应用于其他程序集中的类
  • 必须是静态的,只能访问目标类公共成员
  • 扩展的目标可以是具体类型,也可以是抽象类型或接口

分部类应该在代码生成方案中使用。

由于生成的文件

可能随时被覆盖,因此使用分部类写入未生成的文件。

此外,仅当部件是同一程序集的一部分时,它们才有效 - 它们不能跨越程序集边界。

如果这些不是您的约束,您可以并且应该使用扩展方法 - 当然,在考虑其他可能性(例如继承和组合适用性)之后。

可以在 NULL 实例上使用扩展方法,但不能使用实例方法(分部类或其他)。 这是扩展方法实际上是静态的结果。

当我需要一个类来实现接口时,我使用分部方法,但类代码是自动生成的(VS 使用分部类为 Web 服务和 EF 模型生成代码)。

当我添加到类型的新方法适用于该类型的任何值时,我使用扩展方法。(很好的例子:int。IsEven(),字符串。IsEmpty();不好的例子:int。IsOldEnoughToDrive(), string.IsLastName())。

你可以在

你正在开发的项目中使用分部类,而扩展方法也可以用来扩展你没有源代码的项目。

仅当两个文件位于同一项目中时,部分才有效,并且您可以访问该类的私有成员和受保护成员。

扩展方法只是静态方法,无法访问私有成员。

因此,如果您想访问私有和受保护的成员,您唯一的方法是部分,如果不是,请回答问题,您要添加的方法是否应该在您想要使用类的任何地方可见? 如果是,请使用部分,如果不是,则使用扩展方法。

顺便说一下,如果第一个类不是由某个工具生成的,你可以在那里编写你的函数,除了使用部分;)

希望这有帮助

如果选择"分部类"路由,但发现重复相同的代码,请切换到"扩展方法"。

例如,我有许多生成的类,其中包含返回IEnumerable<Track>数据的方法。我想以某种方式扩展每个类,以便我可以选择以IEnumerable<MediaItem>格式接收数据。

我在这里有一个一般要求,将IEnumerable<Track>数据转换为IEnumerable<MediaItem>。在这种情况下,与其编写多个partial class方法,不如使用扩展方法

public static class ExtensionMethods
{
    public static IEnumerable<MediaItem> ToMediaItems(this IEnumerable<Track> tracks)
    {
        return from t in tracks
               select new MediaItem
               {
                   artist = t.Artist,
                   title = t.Title,
                   // blah blah
               };
    }
}

这给了我以下选择:

var data = Playlist.Tracks.ToMediaItems();
var data = Podcast.Tracks.ToMediaItems();
// etc..

当您想要扩展生成的类时,分部类很有用。 通过这种方式,您可以在一个文件中编写代码,然后当/如果需要重新生成类的其他"部分"时,可以安全地完成,因为该代码文件没有更改。

Partial Class - 

将类、结构或接口的定义拆分到两个或多个源文件中

Extension Method  

扩展方法使您能够将方法"添加"到现有类型,而无需创建新的派生类型、重新编译或以其他方式修改原始类型