类;结构; Enum困惑,有什么更好的?

时间:2010-05-11 08:36:28

标签: c# class return-value messages

我有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;
    }

}

5 个答案:

答案 0 :(得分:4)

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

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

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

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值后,它将以{{1}结尾} case,因为该值与任何其他情况都不匹配。)

答案 1 :(得分:3)

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

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

RetrieveMessage

return _dict[value];

答案 2 :(得分:0)

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

答案 3 :(得分: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;
    }

答案 4 :(得分:0)

它肯定会更慢(因为它使用反射)但说到紧凑,我认为Enums With Custom Attributes适合这种需要。请继续阅读评论,因为那里提到了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());
}