【发布时间】:2021-10-18 17:03:09
【问题描述】:
我知道枚举不能是字符串
我想要一个具有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。它只接受类型。这正是我正在寻找的。p>
【问题讨论】:
-
确实@Fildor,也许DescriptionAttribute可以匹配问题,有点粗鲁。
-
为什么不使用枚举成员名(如果需要字符串,则使用 ToString()),而其余时间将其用作枚举?
enum Unit { px, [in] }和var x = Unit.px; string xs = x.ToString()- 通常您只需要一个用于输出目的的字符串... -
无论何时你想要字符串,但请记住,你经常可以使用调用 toString 的东西——例如,如果你使用 Console.WriteLine 来调用它,它会调用 ToString.. 如果你用字符串插值它也会。您可能可以将代码中的“在枚举上调用 tostring 的位置数”简化为一两个...
-
你可以使用打字机然后...
class Unit{ public Unit Pixel { get => return PixelUnit } }class PixelUnit:Unit { public override string ToString() => "px"; }}?应该在您的 WriteUnit 中工作,Console.WriteLine 将调用 ToString().. 如果您需要,单元可以有一个字符串解析例程.. ?如果您真的希望在传递字符串时发生爆炸,可以添加会爆炸的 WriteUnit 重载.. 但是添加重载只是为了让开发人员看到“不要用字符串调用此方法”绝对是奇怪的.. 更容易根本不提供方法,我认为