标准方法与扩展方法

Yoa*_*. B 6 c#

假设以下域实体:

public enum Role
{
    User = 0,
    Moderator = 1,
    Administrator = 2
}

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public Role Role { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我需要知道用户是否可以执行"编辑"操作.所以我有2个解决方案:

在User实体中创建CanEdit方法

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public Role Role { get; set; }

    public bool CanEdit()
    {
        return Role == Role.Moderator || Role == Role.Administrator;
    }
}
Run Code Online (Sandbox Code Playgroud)

为用户类型创建CanEdit扩展方法:

public static class UserExtensions
{
    public static bool CanEdit(this User user)
    {
        return user.Role == Role.Moderator || user.Role == Role.Administrator;
    }
}
Run Code Online (Sandbox Code Playgroud)

两种解决方案都有效,但问题是何时使用标准方法与使用扩展方法?

Aar*_*ght 11

对于普通的普通静态方法,扩展方法只是语法糖.

如果你控制类的结构,你应该实施所有必要的功能的类.扩展方法确实有用/必要的地方是你不拥有你想要"扩展"的类.

对于这个例子,我认为你应该将逻辑放在User类中.它是用户自身的逻辑功能; 消费者应该能够使用该CanEdit()方法而无需使用甚至不了解UserExtensions该类.

  • 以`IEnumerable.Select`为例; .NET团队可以将它添加到接口定义中,然后将复制粘贴代码添加到实现`IEnumerable <T>`的几十个类中的每一个中 - 或者他们可以在一个地方添加一个扩展方法来完成同一件事情.后者是一个更清洁的设计.如果你有20个不同的`User`类都实现了一个`IUser`接口,那么我可能会建议在`IUser`接口中添加一个扩展方法 - 如果抽象基类无法完成相同的任务. (2认同)