将枚举列表定义为 DTO Class C#

Defining List of Enum as DTO Class C#

这是我的输入JSON响应

{
   "permissions": {
            "user": [
                "Add",
                "Update",
                "Delete"
            ],
            "Product": [
                "Read",
                "Create"
            ]
        }
}

我正在尝试为此创建 DTO class。到目前为止,我已经创建了一组具有可用值的枚举

PermissionAction 枚举

 public enum PermissionAction
    {
        Add,
        Update,
        Read,
        Delete,
        Create
    }

PermissionItem 枚举

public enum PermissionItem
{
    User,
    Product
}

如何使用可用的枚举为给定的 JSON 响应创建 DTO Class?

我累得不一样

public class Permissions
{

    public List<PermissionAction> User { get; set; }

    public List<PermissionItem> Product { get; set; }
}

这是错误的。

因为响应可能会动态变化。我的意思是有时 User 列表不可用,有时 Product 不可用。

喜欢,

{
   "permissions": {
            "user": [
                "Add",
                "Update",
                "Delete"
            ]
      }
}

我的 DTO 也需要支持这些类型的响应 Class。

更新 1:

我认为我在上面发布的 JSON 让其他人感到困惑。很抱歉造成混乱。实际上,我的权限 JSON 对象包含在权限项列表中,其中每个权限项本身又具有权限操作列表。

您似乎需要使用二进制或(即 |)自定义序列化。

Enum已经可以解析很多名字了:

[Flags] // <--- Don't forget to apply this attribute if you want masks!
public enum A { X, Y }

Enum.TryParse<A>("X, Y", out var flags);

if(flags.HasFlag(A.X) && flags.HasFlag(A.Y))
{
    // It'll enter here!
}

毫无疑问,您需要自定义反序列化,以便 flags 作为 arrays 变成逗号分隔的大写标志字符串。

也就是说,你最终会得到这个 class:

public class Permissions
{
    public Permissions(A a, B b) 
    {
        A = a;
        B = b;
    }

    public A A { get; }
    public B B { get; }
}

您可以使用从 NuGet 获得的 Newtosoft.Json 执行此操作:

void Main()
{
    string json = @"{
   ""permissions"": {
            ""user"": [
                ""Add"",
                ""Update"",
                ""Delete""
            ],
            ""Product"": [
                ""Read"",
                ""Create""
            ]
        }
}";

    var root = Root.FromJson(json);

    Console.WriteLine("C# Object");
    Console.WriteLine("Permissions:");
    Console.WriteLine("\tUser:[");
    foreach (var v in root.Permissions.User)
    {
        Console.WriteLine($"\t\t{v}");
    }
    Console.WriteLine("\t]");
    Console.WriteLine("\tProduct:[");
    foreach (var v in root.Permissions.Product)
    {
        Console.WriteLine($"\t\t{v}");
    }
    Console.WriteLine("\t]");


    Console.WriteLine("As JSON string");
    Console.WriteLine(root.ToJson());
}

[JsonConverter(typeof(StringEnumConverter))]
public enum UserAction { 
    Add,
    Update,
    Delete
}

[JsonConverter(typeof(StringEnumConverter))]
public enum ProductAction
{
    Read,
    Create
}

public partial class Root
{
    [JsonProperty("permissions")]
    public Permissions Permissions { get; set; }

    public static Root FromJson(string json) => JsonConvert.DeserializeObject<Root>(json);
    public string ToJson() => JsonConvert.SerializeObject(this);
}

public class Permissions
{
    [JsonProperty("user")]
    public List<UserAction> User { get; set ; }

    [JsonProperty("Product")]
    public List<ProductAction> Product { get; set; }
}