簡體   English   中英

如何在 C# 的創建塊內一行中檢查變量類型

[英]How to check variable type in one line, inside creation block in C#

我正在創建自定義 Json 到 Object 轉換,因為我需要根據它是字符串還是 Z157DB7DF530023575515ZD366C9B672E8 以不同方式處理其中一個 JToken 但是我不確定如何以緊湊和干凈的方式獲得解析。

代碼:

    public class MyClass
    {
        public int Id { get; set; }
        public string SomeOtherDataPoint { get; set; }
    }

    public int CreateNewIntIdBasedOnString(string stringId)
    {
        //some code
    }

    public IEnumerable<MyClass> ConvertJArrayToMyObjects(JArray array)
    {
        return array.Select(d => new MyClass() {
            Id = ((JObject)d).GetValue("id") == int ? ((JObject)d).GetValue("id") : CreateNewIntIdBasedOnString((string)((JObject)d).GetValue("id")),
            SomeOtherDataPoint = (string)((JObject)d).GetValue("someOtherDataPoint")
        });
    }

((JObject)d).GetValue("id") == int不是一回事,所以我需要類似int.TryParse的東西,它可以在一行上工作。 我可以為它創建一個方法,但是這似乎很奇怪,因為這還不夠普遍,以至於沒有標准化的方法。

我認為試圖將所有內容都保留在一個表達式中是錯誤的方法——你最終會不必要地重復自己。

如果我正確地解釋了您想要的內容,我會將其寫為:

public static IEnumerable<MyClass> ConvertJArrayToMyObjects(JArray array)
{
    return array.Values<JObject>().Select(d =>
    {
        var id = d.Value<string>("id");
        return new MyClass()
        {
            Id = int.TryParse(id, out var intId) ? intId : CreateNewIntIdBasedOnString(id),
            SomeOtherDataPoint = d.Value<string>("someOtherDataPoint"),
        };
    });
}

如果您真的想將其填充到單個表達式中,則可以(ab)使用var模式:

public static IEnumerable<MyClass> ConvertJArrayToMyObjects(JArray array)
{
    return array.Values<JObject>().Select(d =>
        new MyClass()
        {
            Id = d.Value<string>("id") is var id && int.TryParse(id, out var intId) ? intId : CreateNewIntIdBasedOnString(id),
            SomeOtherDataPoint = d.Value<string>("someOtherDataPoint"),
        });
}

暫無
暫無

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

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