[英]How to check variable type in one line, inside creation block in C#
I'm creating a custom Json to Object conversion, as I need to handle one of the JTokens differently depending on if it's a string or an integer.我正在创建自定义 Json 到 Object 转换,因为我需要根据它是字符串还是 Z157DB7DF530023575515ZD366C9B672E8 以不同方式处理其中一个 JToken However I'm not sure how to obtain the parsing in a compact and clean way.
但是我不确定如何以紧凑和干净的方式获得解析。
Code:代码:
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
isn't a thing, so I need something like int.TryParse
which work on one line. ((JObject)d).GetValue("id") == int
不是一回事,所以我需要类似int.TryParse
的东西,它可以在一行上工作。 I could create a method for it, but it seems weird that this isn't common enough that there isn't a standardized way of doing it.我可以为它创建一个方法,但是这似乎很奇怪,因为这还不够普遍,以至于没有标准化的方法。
I think trying to keep everything in one expression is the wrong approach -- you end up repeating yourself unnecessarily.我认为试图将所有内容都保留在一个表达式中是错误的方法——你最终会不必要地重复自己。
If I'm interpreting what you want correctly, I'd write it as something like:如果我正确地解释了您想要的内容,我会将其写为:
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"),
};
});
}
If you really want to stuff it in a single expression, you can (ab)use a var
pattern:如果您真的想将其填充到单个表达式中,则可以(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.