分部类与扩展方法
本文关键字:扩展 方法 | 更新日期: 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
扩展方法使您能够将方法"添加"到现有类型,而无需创建新的派生类型、重新编译或以其他方式修改原始类型