小编Jon*_*ase的帖子

通过字符串转换反序列化枚举时,如何获取空值而不是序列化错误?

我的一些API端点的模型都包含枚举。FluentValidation用于验证发送的值是否满足各自的要求。

为了有助于可用性和文档生成,枚举被允许作为字符串而不是整数发送。如果发送的整数无效,则验证发送的值是否在正确的范围内是可行的,但是如果发送的字符串无效,则序列化将失败。

public enum Foo 
{
    A = 1,
    B = 2
}

public class Bar 
{
    public Foo? Foo {get;set;}
}

void Main()
{
    var options = new JsonSerializerOptions();
    options.Converters.Add(new JsonStringEnumConverter());
    options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

    var jsonString = "{\"foo\": \"C\"}";
    var jsonSpan = (ReadOnlySpan<byte>)Encoding.UTF8.GetBytes(jsonString);

    try
    {
        var result = JsonSerializer.Deserialize<Bar>(jsonSpan, options);
        Console.WriteLine(result.Foo == null);
    }
    catch(Exception ex) 
    {
        Console.WriteLine("Serialization Failed");
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望的结果是,当字符串与枚举的任何字段都不匹配时,将枚举属性简单地反序列化为null,以便可以将模型传递给验证器以创建友好消息。

我该如何实现?这是通过System.Text.Json API使用网络核心3预览版8。

c# .net-core system.text.json

6
推荐指数
1
解决办法
232
查看次数

为什么这种方法组转换在C#7.2及更低版本中不明确?

鉴于以下课程:

public class Foo {
    public Foo(int i, double d) {
        Integer = i;
        Double = d;
    }
    public int Integer {get;}
    public double Double {get;}

    private static Random rand = new Random();
    public static Foo CreateRandom() => new Foo(rand.Next(1,101), rand.NextDouble());
}
Run Code Online (Sandbox Code Playgroud)

以及这种用法:

void Main()
{
    var items = Enumerable.Range(0, 50)
                          .Select(_ => Foo.CreateRandom());

    Console.WriteLine(items.Sum(GetInteger)); // Fine
    Console.WriteLine(items.Sum(GetDouble)); // Ambiguous
    Console.WriteLine(items.Sum(x => x.Double)); // Also fine
    Console.WriteLine(items.Sum((Func<Foo,double>)GetDouble)); // Cast required? Why?

    int GetInteger(Foo item) => item.Integer;
    double GetDouble(Foo item) => …
Run Code Online (Sandbox Code Playgroud)

c# c#-7.0 visual-studio-2017 c#-7.2 c#-7.1

3
推荐指数
1
解决办法
142
查看次数