强制开发者使用来自特殊类的字符串

本文关键字:字符串 开发者 | 更新日期: 2023-09-27 18:10:16

我有一个ObjectResult,如果发生错误,它将返回一条错误消息。我希望开发人员不能在这里输入他们自己的信息;它们必须在一个特殊的类中使用一组预先确定的消息字符串中的一个(只是为了管理消息)。

例如,我不希望这是可能的:

ObjectResult obj = new ObjectResult() {Message = "xxx"};

开发者应该这样写:

ObjectResult obj = new ObjectResult() {Message = MessagesStore.SomeMessage};

我如何实现这样的东西?

强制开发者使用来自特殊类的字符串

您可以在objectreresult类中声明Enum类型的MessagesStore,

enum MessagesStore
    {
    None,
    Error,
    ok,      
    };

我更喜欢这样使用:

    public class MessagesStore
    {
        public class Error
        {
            public const string Error1= "Error1";
            public const string Error2= "Error2";
        }
        public class Warning
        {
            public const string Warning1 = "Warning1";
            public const string Warning2 = "Warning2";
        }
    }

然后你可以访问message:

ObjectResult obj = new ObjectResult() {Message = MessagesStore.Error.Error1};

您可以将可用字符串的集合放入enum

public enum MessageString
{
  [Description("Message one")]
  Message1,
  [Description("Message two")]
  Message2,
}

然后改变Message属性以返回MessageString类型或删除默认构造函数并要求传递MessageString参数:

public class ObjectResult
{
  public MessageString Message { get; set;}  
}
public class ObjectResult
{
  public string Message { get; private set;}  
  public ObjectResult(MessageString message)
  {
    Message = message.GetDescription();
  }
}

声明一个枚举并使用描述属性装饰条目

public enum MessagesStore
{ 
    [Description("Everything is Ok")]
    Ok,
    [Description("Everything is not Ok")]
    NotOk
}

使用以下扩展方法

 public static class EnumExtensions
{
    public static string GetEnumDescription(this Enum value)
    {
        var fi = value.GetType().GetField(value.ToString());
        var attributes =
            (DescriptionAttribute[])fi.GetCustomAttributes(
            typeof(DescriptionAttribute),
            false);
        if (attributes != null &&
            attributes.Length > 0)
        {
            return attributes[0].Description;
        }
        return value.ToString();
    }
}

和,一个用法的例子:

var ms = MessagesStore.Ok;
var desc = ms.GetEnumDescription();

desc with be "Everything is Ok"

我将结合stringsenums来强制用户使用已经指定的文本。这是一个稍微不同的方法,不使用Attributes:

添加ObjectResult类:

public enum InfoMessages
{
   Error1,
   Error2,
   Warning1,
   Warning2
};

然后用Messages参数编辑ObjectResult类构造函数:

public ObjectResult(InfoMessages message)
{
   SetMessage(message);
}

然后使方法根据给定的enum设置正确的字符串:

public void SetMessage(InfoMessages message)
{
    switch (message)
    {
       case InfoMessages.Error1: this.Message = "Error message for Error1"; break;
       case InfoMessages.Error2: this.Message = "Error message for Error2"; break;
       // ...
    }
}