![](/img/trans.png)
[英]C#: How to define implicit type variable inside IF block and use outside
[英]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.