简体   繁体   English

如何在 C# 的创建块内一行中检查变量类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM