类和枚举的类型转换器

本文关键字:类型转换 转换器 类型 枚举 | 更新日期: 2023-09-27 18:12:07

我有一个class Claim和一个Enum Role

我经常需要将Claim转换为Role或相反。

通常我也会将List<Claim>转换为List<Role>或相反。

在此例中,Role为以下enum:

public enum Role {
  Leader = 1,
  Editor = 2
} // Role

注意:为了简单起见,只包含2个项目。

则Claim是一个具有两个属性的类:

public class Claim {
  public String Type { get; set; }
  public String Value { get; set; }
}
  1. 转换RoleClaim:

    Claim.Type = "Role" and Claim.Value={Role Text} (Example: Leader)

  2. Role转换为Claim:

仅适用于类型为RoleClaims

在这种情况下,转换是逆if (1)

我不确定类型转换器是否是最佳解决方案。

但是我想让这些转换尽可能简单。

一些可重用的东西,因为我经常需要做这个转换。

也许是一个扩展?一个辅助吗?类型转换器?

类和枚举的类型转换器

TypeConverter不是您想要的,它的实现往往更加密集,更加迟钝,并且允许您似乎不需要的设计时功能。如果您的目标是允许使用这些对象的人以最少的代码在两者之间移动,您可以定义一个隐式转换(或者一个显式转换,如果您想强制强制转换语法)。

public class Claim
{
    public String Type { get; set; }
    public String Value { get; set; }
    public static implicit operator Role(Claim claim)
    {
        return (Role)Enum.Parse(typeof(Role), claim.Value);
    }
    public static implicit operator Claim(Role role)
    {
        return new Claim() { Type = "Role", Value = role.ToString() };
    }
}

这样做将允许下面的代码工作,因为它将利用您已经定义的转换。

Claim claim = Role.Leader;
Role role = claim;  

你在评论中说过你不能碰Claim类。那么,最简单的方法可能是扩展方法。

static class ClaimExtensions
{
    public static Role ToRole(this Claim claim)
    {
        return (Role)Enum.Parse(typeof(Role), claim.Value);
    }
    public static Claim ToClaim(this Role role)
    {
        return new Claim() { Type = "Role", Value = role.ToString() };
    }
}

这将意味着一个方法调用,但是对于开发人员来说,使用和理解它是相当简单的。

Claim claim = Role.Leader.ToClaim();
Role role = claim.ToRole();

如何创建和使用类型转换器?

您只需阅读如何:实现类型转换器

如果你想根据另一个的值"获取"或创建一个,你可以做两件事:

1 -从枚举到类,我将使用工厂方法。传入一个enum并返回一个适当类型的类。

2 -我会将索赔"Type"属性更改为角色类型的enum,以便您可以立即检索与索赔相关的enum值。

如果这不能工作,因为"Type"可能包含不在Role枚举中的值,那么我将添加一个角色类型的可能为空的属性。