首页 > 解决方案 > 当枚举不可为空且没有任何空选项时,检查它是否为空

问题描述

这与下面的问题不同

如何判断枚举属性是否已设置?C#

我正在使用现有的 DataContract 类创建 WCF Rest 服务。我不能将枚举之类的属性数据类型更改为枚举?并且也不能在我的枚举中添加新选项,如未定义、无,或者默认设置任何内容,因为如果我做这些更改中的任何一个,它将产生广泛的影响,许多应用程序都依赖它。

通常人们使用像 POSTMAN 这样的应用程序调用我的 WCF REST 服务,他们在其中发送 json 数据,如下所示,其中性别是男性、女性、跨性别等的枚举。如果他们不发送它,我的服务会抛出异常,我想添加验证当 QA 使用 POSTMAN 调用我的服务并发送 JSON 数据时检查枚举是否为空的逻辑,即使它不可为空并且我的枚举中也没有任何 None、Null 选项?如果它是 NULL 我想ArgumentNullException用好消息发回给呼叫者。我想优雅地处理这种情况。

public enum Gender 
{
    Male = 0,
    Female = 1,
    Transgender = 2
}

下面不错

{
      "Name" : "XXX"
      "Gender" : "1"
}

下面抛出错误

{
      "Name" : "XXX"
      "Gender" : ""
}

解决方案:

感谢 pswg 指出正确的方向,我在下面标记了他的答案。我正在使用 Newtonsoft,所以我喜欢下面

string stringfydata = Newtonsoft.Json.JsonConvert.SerializeObject(requestGender);
if(string.IsNullOrEmpty(stringfydata))
{
   throw new ArgumentNullException("Gender value cannot be NULL or Empty.");
}

标签: c#enumsnull

解决方案


除了在类中扭曲枚举的明显选项(这在您的特定情况下可能不起作用)之外,您可以将枚举变量设置为枚举范围之外的整数。之后,您可以检查整数是否在枚举中定义。由于 C#不检查枚举,因此您可以执行以下操作:

    public enum Gender
    {
        Male = 0,
        Female = 1,
        Transgender = 2
    }

    public int HandleGender(string strJsonGender){
        if (strJsonGender == "")
        {
            return -1;
        }
        else {
            // Get int representation of the gender
            return (int)((Gender)Enum
                    .Parse(typeof(Gender),
                           strJsonGender, true));
        }
    }

    public void MainMethod(string strJsonGender) {
        Gender gVal;
        int iVal = HandleGender(strJsonGender);

        if (Enum.IsDefined(typeof(Gender), iVal))
        {
            // Handle if the an actual gender was specified
            gVal = (Gender)iVal;
        }
        else { 
            // Handle "null" logic
        }

推荐阅读