c# - 标准方法与扩展方法

标签 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; }
}

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

在用户实体中创建一个 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;
    }
}

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

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

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

最佳答案

扩展方法只是普通静态方法的语法糖。

如果您控制类结构,则应该类中实现所有必要的功能。如果您不拥有要“扩展”的类,那么扩展方法真正有用/必要的地方。

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

关于c# - 标准方法与扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2352535/

相关文章:

c# - c#中的组合框选择值

c# - 如何使我的 C# DLL 成为自注册 dll

c# - 强制 Expression<> 评估局部变量

c# - 自定义属性 - 为枚举获取 "not a valid named attribute argument"

c# - 使用OpenCV从youtube捕获实时视频

c# - 如何引用引用类型字典键的属性?

c# - COM1 打开后如何关闭?

c# - Linq group by 然后只获取其中一项

c# - 命名空间 'Mvc' 中不存在类型或命名空间名称 'System.Web'(您是否缺少程序集引用?)

C# 根据另一个数组对数组的一部分进行排序