【问题标题】:Type converter for Class and Enum类和枚举的类型转换器
【发布时间】:2013-04-28 08:47:11
【问题描述】:

我有一个class Claim 和一个Enum Role

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

通常我也会将List<Claim> 转换为List<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

仅适用于类型为RoleClaims

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

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

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

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

也许是一个扩展?帮手?类型转换器?

【问题讨论】:

  • 没有任何代码,我想没有人能回答你。
  • 你能添加一些代码来显示你如何来回翻译它们吗?
  • 我刚刚更新了我的帖子并添加了代码。

标签: c# type-conversion


【解决方案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();

【讨论】:

  • 这很好......但如果我无法在 Claim 类中做任何事情......它是一个 .NET 类。也许扩展是一种方式。
【解决方案2】:

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

你刚刚读到How to: Implement a Type Converter

【讨论】:

    【解决方案3】:

    如果你想“获取”或基于另一个值创建一个,你可以做两件事:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多