.Net - 避免魔术弦的策略

时间:2010-07-08 15:57:59

标签: .net magic-string

在工作代码中,我们对魔术字符串有很多用法,如下面的代码片段:

if (user.HasRight("Profile.View")) {...}

因此,有很多地方我们将字符串作为参数传递,以查看用户是否具有特定权限。我不喜欢这样,因为它产生了很多神奇的字符串。

这样做的更好方法是什么?

Enum,Constant,class?

6 个答案:

答案 0 :(得分:17)

在该特定情况下,使用枚举。没有魔法字符串,如果Enum发生变化(以某种方式破坏魔术字符串解决方案),应用程序将不再编译。

public enum ProfilePermissions
{
    View,
    Create,
    Edit,
    Delete
}

然后你可以简单地拥有:

if(user.HasRight(ProfilePermissions.View)) { }

你也可以使用一个类,但是当你遇到更复杂的场景时,你会限制自己。例如,将枚举简单地更改为:

public enum ProfilePermissions
{
    View = 1,
    Create = 2,
    Edit = 4,
    Delete = 8
}

允许您使用按位运算符来获得更复杂的权限(例如,用户需要创建或删除的情况):

if(user.HasRight(ProfilePermissions.Create | ProfilePermissions.Delete));

答案 1 :(得分:8)

这在.NET框架中也很常见。示例是System.Windows.DataFormats和System.Net.WebRequestMethods.Http。你想要的只读:

public static class MumbleRights {
  public static readonly string ProfileView = "Profile.View";
  // etc..
}

答案 2 :(得分:3)

扩展方法!将它们放在同一个地方以跟踪所有魔法弦。

public static class UserRightsExtensions {
  public static bool CanReadProfile(this User user)
  {
    return user.HasRight("Profile.View");
  }

  // etc..
}

然后你可以:

if (user.CanReadProfile()) .....

答案 3 :(得分:1)

创建一个强类型的类,如

public static class UserInfo
{
  public static bool CanViewProfile { get { return User.HasRight("Profile.View"); } }
}

这会将您的“神奇字符串”保存在代码中的一个位置。枚举也会起作用,但在我看来并不那么可读。

注意:我的示例旨在充当登录用户的属性代理,因此是静态类。如果您想要一些可以处理更直接数据的东西(比如用户列表),那么这种类型的类需要是非静态的,并且基于每个用户的帐户进行实例化。

答案 4 :(得分:0)

您可以在C#中执行常量字符串。

您可以在标题中定义所有字符串,如下所示:

const string PROFILE_VIEW "Profile.View";

不确定这是否是“最佳”方式,但它肯定比在代码中具有魔术值更好。

答案 5 :(得分:0)

我是“Justin Niessner”所示的第二种方式。但在某些情况下,我更愿意编写以下代码构造。

public  class User
    {
        public Permission Permission { get; set; }

    }
    public abstract class Permission
    {

    }
    public class ViewPermission:Permission
    {

    }

您可以将其作为

使用
User user=new User();
            if(user.Permission is ViewPermission)
            {

            }