为类和枚举键入转换器

Mig*_*ura 0 c# type-conversion

我有一个class Claim和一个Enum Role.

我经常需要转换ClaimRole或相反.

通常我也转换List<Claim>List<Role>或相反.

在这种情况下,Role是以下枚举:

public enum Role {
  Leader = 1,
  Editor = 2
} // Role
Run Code Online (Sandbox Code Playgroud)

注意:为简单起见,仅包含2个项目.

然后,Claim是一个具有两个属性的类:

public class Claim {
  public String Type { get; set; }
  public String Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 转换RoleClaim:

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

  2. 转换RoleClaim:

仅适用于Claims哪种类型Role.

在这些情况下,转换是反向的,如果(1)

我不确定Type转换器是否是最佳解决方案.

但我想以某种方式使这些转换尽可能简单.

可重复使用的东西,因为我经常需要进行此转换.

也许延期?帮手?型转换器?

Chr*_*non 6

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() };
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做将允许以下代码工作,因为它将使用您定义的转换.

Claim claim = Role.Leader;
Role role = claim;  
Run Code Online (Sandbox Code Playgroud)

更新

您在评论中说过,您无法触及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() };
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着一个方法调用,但开发人员使用和理解它会相当简单.

Claim claim = Role.Leader.ToClaim();
Role role = claim.ToRole();
Run Code Online (Sandbox Code Playgroud)