65.9K
CodeProject 正在变化。 阅读更多。
Home

构建 Silverlight 企业应用程序时的冒险 - 第 24 部分

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009年10月7日

CPOL

2分钟阅读

viewsIcon

8709

构建 Silverlight 企业应用程序时的冒险

最近,我在为我们的应用程序框架设计细节时,遇到了一些老派的 enum 用法,想和大家分享一下。 关键在于将 char 隐式地用作 enum 的底层类型,以及为什么你可能需要这样做。

故事

在开发我们应用程序的一个模块时,我需要找到一种方法来存储一个人的性别。 结果是,数据库中没有数据指定一个性别列表。 由于这完全关系到某人护照上的性别,我们只需要两个值(显然是 'male' 和 'female'),并决定只将这些值的第一个字符存储在数据库中。 我们不想在数据库中创建一个 Gender 表的原因是出于清晰考虑。 我们已经引入了一条规则,即所有主键都应该是 SQL 类型 uniqueidentifier(.NET 类型 Guid),并且为性别设置外键会导致在数据库中为每个性别存储一个 Guid,这不仅会过于复杂,而且会使事情变得更加复杂。

因此在数据库端,我们有一个 char(1) 列。 但这不是你希望在整个 .NET 代码中使用的。 为此场景使用 enum 是显而易见的选择,也是我所选择的。 幸运的是,Silverlight 在数据绑定 enum 类型方面配备得很好。 这里有一个潜在的问题。 .NET enum 仅支持 int 类型作为其底层类型...

...或者它们真的支持吗? 显式地指定像 enum Gender: char 这样的内容是无法编译的,但如果这样做呢?

public enum Gender
{
Female = 'f',
Male = 'm'
}

这实际上是有效的。 但会发生什么? char 现在是这个 enum 的底层类型吗? 让我们弄清楚。 我运行了以下代码来弄清楚

MessageBox.Show(string.Format("Enum underlying type: {0}", 
	Enum.GetUnderlyingType(typeof(Gender)).Name));

结果,底层类型是 Int32。 嗯,这真的能起作用吗? 它实际存储的是什么值?

我将代码扩展到以下内容

MessageBox.Show(string.Format("Enum underlying type: {0}\r\n" + 
"Enum value as int: {1}\r\n" +
"Enum value as char: {2}", 
Enum.GetUnderlyingType(typeof(Gender)).Name, 
((int)_person.Gender).ToString(), 
((char)_person.Gender).ToString()
));

现在它会向我显示所选性别值的 int 值和 char 值转换。 在这种情况下,_person.GenderGender.Male。 存储的实际 int 值是 109,这是 'm' charbyte 值。 char 转换上的 ToString 方法返回了 'm' char

太棒了。 现在我可以将我的 Gender enum 值转换为 char 在某个时候存储。 但是如何将其加载回 Gender enum 呢? 结果是,你可以双向转换,所以像这样可以工作

_person.Gender = (Gender)genderCharTextBox.Text[0];

双向性真棒! 所以现在我们可以轻松地存储没有底层模型的 enum 类型。 简单但强大的东西,我希望对你有所帮助。

我上传了一个简单的项目,我用它来测试所有这些,这里

© . All rights reserved.