c# - 如何制作一组强类型的字符串值?
问题描述
我知道枚举不能是字符串
我想要一个具有实用程序的数据结构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
如果你传递一个字符串,这个方法会抛出一个。它只接受类型。这正是我正在寻找的。
解决方案
如评论中所述,您不能直接将枚举映射到字符串。
也就是说,没有什么可以阻止您创建枚举到字符串值的映射,只能通过枚举访问。如果您维护映射,则可以保证该值始终存在。
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();
推荐阅读
- c++11 - 纯虚析构函数是否足以使类抽象?
- c# - 需要从c#中的字符串中提取列名
- ruby-on-rails - 在 Rspec 中使用 2 个独立的数据库来测试库
- macos - 如何在不升级操作系统的情况下修复 vscode Language Server 的错误
- docker - 无法在 COPY 指令中使用 ARG 构建 Docker 多阶段映像
- inno-setup - 在 Inno Setup 中备份以前的安装,同时排除一些文件夹(备份文件夹本身)
- reactjs - 如何在 Firebase 托管中执行查询字符串?
- wordpress - 仅在 WordPress 中登录后显示的联系表格 7 更改
- angular - 如何使第一个 rootLevelNode 默认打开
- android - 未通话时 Android 将麦克风静音