为类和枚举键入转换器

时间:2013-05-03 21:05:07

标签: c# type-conversion

我有class ClaimEnum Role

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

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

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

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

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

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

public class Claim {
  public String Type { get; set; }
  public String Value { get; set; }
}
  1. Role转换为Claim

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

  2. Role转换为Claim

  3. 仅应用于Claims哪个类型为Role

    在这些情况下,如果(1)

    则转换是反向的

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

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

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

    也许是扩展名?帮手?型转换器?

3 个答案:

答案 0 :(得分: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() };
    }
}

执行此操作将允许以下代码工作,因为它将使用您已定义的转换。

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 :(得分:0)

  

如何为此创建和使用Type转换器?

您刚刚阅读How to: Implement a Type Converter

答案 2 :(得分:0)

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

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

2 - 我会将声明“Type”属性更改为Role类型的枚举,以便您可以立即检索与caim关联的枚举值。

如果这不起作用,因为“Type”可能包含不在Role enum中的值,那么我将添加一个可能为Role类型的可为空的属性。