簡體   English   中英

當枚舉不可為空並且沒有任何空選項時,請檢查其為空

[英]Check enum null when it is not nullable and do not have any null options

這與下面的問題不同

如何判斷是否已設置枚舉屬性? C#

我正在使用現有的DataContract類創建WCF Rest服務。 我不能將枚舉之類的屬性數據類型更改為枚舉嗎? 而且也無法在枚舉中添加未定義,無選擇或默認設置的任何新選項,因為如果我進行這些更改中的任何一個,都會對整個公司產生廣泛的影響,並且許多應用程序都依賴它。

通常,人們使用POSTMAN之類的應用程序來調用我的WCF REST服務,他們在其中發送json數據(如下所示),其中Gender是一個包含Male,Female,Transgender等的枚舉。如果不發送,我的服務將引發異常,我想添加驗證QA使用POSTMAN調用我的服務並發送JSON數據(即使該屬性不可為空並且在我的枚舉中也沒有任何None,Null選項)時,檢查枚舉是否為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.");
}

除了顯而易見的使類中的枚舉變形的選項(在您的特定情況下可能不起作用)之外,您可以將enum變量設置為超出枚舉范圍的整數。 之后,您可以檢查是否在枚舉中定義了整數。 由於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
        }

注意:由於您已經在問題中指出,因此下面的答案使用DataContracts ,但是Json.Net序列化也存在類似的解決方案。

您可以使用[DataMember(EmitDefaultValue = false)]忽略根本未指定Gender情況。 在這種情況下,返回的值將是為枚舉成員分配的值均為0的值(請注意,如果沒有成員具有該值,則仍將獲得值0 ,這可能對您有用)。

[DataContract]
class Person
{
    [DataMember]
    public string Name { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public Gender Gender { get; set; }
}


void Main()
{
    var json = "{\"Name\": \"XXX\"}";
    var ser = new DataContractJsonSerializer(typeof(Person));
    var obj = ser.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json)));
    obj.Dump(); // Person { Name = "XXX", Gender = Male }
}

要處理提供空字符串而不是有效值或根本沒有值的情況,可以使用以下技巧:

[DataContract]
class Person
{
    [DataMember]
    public string Name { get; set; }

    [IgnoreDataMember]
    public Gender Gender
    {
        get
        {
            if (GenderValue.GetType() == typeof(string))
            {
                Enum.TryParse((string)GenderValue, out Gender result);
                return result;
            }
            return (Gender)Convert.ToInt32(GenderValue);
        }
        set
        {
            GenderValue = value;
        }
    }

    [DataMember(Name = "Gender", EmitDefaultValue = false)]
    private object GenderValue { get; set; }
}


void Main()
{
    var json = "{\"Name\": \"XXX\", \"Gender\": \"\"}";
    var ser = new DataContractJsonSerializer(typeof(Person));
    var obj = ser.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json)));
    obj.Dump(); // Person { Name = "XXX", Gender = Male }
}

但是,這有點尷尬,很容易被濫用。 我建議您謹慎使用此方法。 正如其他人提到的,我們通常希望在將無效值提供給函數/ API時引發錯誤。 通過“快速失敗”,您可以使嘗試使用API​​的用戶知道他們已經構建了一個可能在某個時候產生意外結果的請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM