3

我有 46 行信息,每行 2 列(“代码”、“描述”)。这些代码将根据其初始提交请求的成功或失败返回给客户端。我不想使用数据库文件(csv、sqlite 等)进行存储/访问。对于我希望如何向客户端显示这些代码,我能想到的最接近的类型是异常类。如果我错了,请纠正我,但据我所知,枚举不允许字符串,尽管这种结构最初基于它的工作方式似乎是更好的选择(例如 100 =“请求中缺少名称”)。

想一想,创建一个班级可能是最好的作案手法。但是,我会感谢那些可能处于类似情况的人提供更有经验的建议或指导和意见。

目前这就是我所拥有的:

    class ReturnCode
{
    private int _code;
    private string _message;

    public ReturnCode(int code)
    {
        Code = code;
    }

    public int Code
    {
        get
        {
            return _code;
        }
        set
        {
            _code = value;
            _message = RetrieveMessage(value);
        }
    }

    public string Message { get { return _message; } }

    private string RetrieveMessage(int value)
    {
        string message;

        switch (value)
        {
            case 100:
                message = "Request completed successfuly";
                break;
            case 201:
                message = "Missing name in request.";
                break;
            default:
                message = "Unexpected failure, please email for support";
                break;
        }

        return message;
    }

}
4

5 回答 5

4

最好的将是一个类和一个枚举。然后,您可以拥有比“201”更多的描述性标识符。

结构也可以,但它们更难正确实现,所以你应该坚持一个类,除非你出于某种原因特别需要一个结构。

您不需要在类中存储对消息的引用,您可以在需要时在Message属性中获取它。Aswitch是使用哈希表实现的(如果有五个或更多的值),因此查找速度非常快。

public enum ReturnIdentifier {
  Success = 100,
  MissingName = 201;
}

public class ReturnCode {

  public ReturnIdentifier Code { get; private set; }

  public ReturnCode(ReturnIdentifier code) {
    Code = code;
  }

  public string Message {
    get {
      switch (Code) {
        case ReturnIdentifier.Success:
          return "Request completed successfuly.";
        case ReturnIdentifier.MissingName:
          return "Missing name in request.";
        default:
          return "Unexpected failure, please email for support.";
      }
    }
  }

}

用法:

ReturnCode code = new ReturnCode(ReturnIdentifier.Success);

如果你从某个地方得到一个整数代码,你仍然可以使用它作为枚举值对应的代码:

int error = 201;
ReturnCode code = new ReturnCode((ReturnIdentifier)error);

(如果整数代码与枚举中的任何标识符都不对应,则进行转换仍然是完全有效的。当获取Message值时,它将以这种default情况结束,因为该值与其他任何一个都不匹配例。)

于 2010-05-11T08:46:24.217 回答
3

我认为选择一门课程(就像你一样)是一个很好的决定。Dictionary<int, string>如果您用于将代码映射到描述,您可以使代码更加紧凑和可读。

_dict.Add(100, "Description1");
_dict.Add(201, "Description2");
...............................

并且RetrieveMessage

return _dict[value];
于 2010-05-11T08:43:43.240 回答
0

也许基于字典的方法看起来更优雅。

    private static Dictionary<int, string> errorCodes = 
    new Dictionary<int, string>()
    {
        {100, "Request completed successfuly"},
        {200, "Missing name in request."}
    };

    private string RetrieveMessage(int value)
    {
        string message;
        if (!errorCodes.TryGetValue(value, out message))
            message = "Unexpected failure, please email for support";

        return message;
    }
于 2010-05-11T08:58:52.643 回答
0

如何从 Dictionary 派生,或使用可以索引的 Dictionary 字段将数据表存储在代码中?

于 2010-05-11T08:44:39.707 回答
0

它肯定会更慢(因为它使用反射)但说到紧凑,我认为具有自定义属性的枚举适合这种需求。请继续阅读评论,因为那里提到了DescriptionAttribute 。就像是;

public enum ErrorMessage
{
    [System.ComponentModel.Description("Request completed successfuly")]
    Success = 100,
    [System.ComponentModel.Description("Missing name in request.")]
    MissingName = 201
};

public static string GetDescription(this Enum en)
{
    Type type = en.GetType();

    System.Reflection.MemberInfo[] memInfo = type.GetMember(en.ToString());

    if (memInfo != null && memInfo.Length > 0)
    {
        object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute),
                false);

        if (attrs != null && attrs.Length > 0)
            return ((System.ComponentModel.DescriptionAttribute)attrs[0]).Description;
    }  

    return en.ToString();
}

static void Main(string[] args)
{
    ErrorMessage message = ErrorMessage.Success;
    Console.WriteLine(message.GetDescription());
}
于 2010-05-11T09:13:13.100 回答