首页 > 解决方案 > 如何制作一组强类型的字符串值?

问题描述

我知道枚举不能是字符串

我想要一个具有实用程序的数据结构enum,但它返回字符串而不是整数。需要明确的是,我希望返回类型是类枚举类型,而不是 string. 基本上,我希望能够强制将属性用作字符串,但只允许将其设置为定义的字符串集中的值。就像是

stringenum Unit {
    Pixels = "px",
    Inches = "in"
}

class Settings {
    public Unit Unit { get; set; }
}

var settings = new Settings() { Unit = Unit.Pixels };

...

unitLabel.Text = settings.Unit;

我见过一些解决方案,它们只是创建一个具有返回某个字符串的属性的类。但是,我需要将返回类型限制为一个集合,而不仅仅是任何字符串。

编辑澄清

除了这个方法,考虑我之前的例子:

public void WriteUnit(Unit unit)
{
    Console.WriteLine(unit);
}

// Calling
WriteUnit(Unit.Pixels); // Prints "px"
WriteUnit("px"); // ARGUMENT EXCEPTION

ArgumentException如果你传递一个字符串,这个方法会抛出一个。它只接受类型。这正是我正在寻找的。

标签: c#set

解决方案


如评论中所述,您不能直接将枚举映射到字符串。

也就是说,没有什么可以阻止您创建枚举到字符串值的映射,只能通过枚举访问。如果您维护映射,则可以保证该值始终存在。

public enum Unit
{
    Pixels,
    Inches
}

public static class UnitMapper
{
    private static readonly Dictionary<Unit, string> _map
        = new Dictionary<UserQuery.Unit, string>()
        {
            { Unit.Pixels, "px" },
            { Unit.Inches, "in" }
        }
        
    public static string GetUnit(Unit unit)
    {
        return _map[unit];
    }
}

根据您的其他评论,这可以与自定义的用户定义的隐式运算符结合使用,为您提供您正在寻找的功能类型,尽管您仍然必须调用覆盖.ToString()来输出字符串。

public struct UnitWrapper
{
    private readonly string _unitString;
    private readonly Unit _unit;
    
    public UnitWrapper(Unit unit)
    {
        _unit = unit;
        _unitString = UnitMapper.GetUnit(_unit);
    }

    public static implicit operator UnitWrapper(Unit unit)
    {
        return new UnitWrapper(unit);
    }
    

    public override string ToString() => _unitString;
}

然后可以按如下方式使用:

public class Settings
{
    public UnitWrapper UnitWrapper { get; set; }
}
var settings = new Settings { UnitWrapper = Unit.Pixels };
string px = settings.UnitWrapper.ToString();

推荐阅读