目前我正在开发一个项目,我们有一个查询构建器 - 用户选择他想要的数据,最终报告中显示的内容以及一些过滤器。我们也在使用Entity Framework(Code First),我们需要一些类的每个字符串属性的名称。 E.g:
模型类
public class User {
public int Id { get; set; }
public string FullName { get; set; }
public string FullAddress { get; set; }
}
截至目前,我正在获取所有属性名称:
属性过滤器
var propertyList = type.GetProperties()
.Where(prop => prop.PropertyType == typeof(string))
.Select(prop => prop.Name).ToList();
它适用于我们对数据库所做的任何更改,但是对于用户来说并不容易阅读(特别是如果您认为我们需要将所有代码保留为英语,即使很难,我们也会将其发布给那些大多只会说葡萄牙语。)
我需要的是将“FullName”显示为“Nome Completo”,将“FullAddress”显示为“EndereçoCompleto”等,并且仍能以某种方式获取原始名称。
我想到的一个解决方案是创建一个静态字典并根据需要更新它;使用jQuery(使用简单对象制作的双向字典)很容易处理,但由于数据库变得非常大,因此维护起来会很麻烦。
有没有比静态词典更好的选择?
答案 0 :(得分:1)
您可以将DisplayAttribute
应用于属性,并将其链接到具有英语和/或葡萄牙语友好名称的资源文件。这与MVC的工作方式相同。当您需要获取友好名称时,您只需要在属性上调用GetName()
方法,即可在当前的线程文化中获取相应的名称。
模型类
// add reference to System.ComponentModel.DataAnnotations to your project
public class User
{
public int UserId { get; set; }
// pass the "key" of the resource entry and the name of the resource file
[Display(Name = "FullName", ResourceType = typeof(UserResources))]
public string FullName { get; set; }
[Display(Name = "FullAddress", ResourceType = typeof(UserResources))]
public string FullAddress { get; set; }
public string OtherProp { get; set; }
}
<强> UserResources.resx 强>
默认英文版(如果网站本身不是真正的“多语言”,你可以把葡萄牙语放在这里)
FullName Full Name
FullAddress Full Address
<强> UserResources.pt-pt.resx 强>
葡萄牙语翻译
FullName Nome Completo
FullAddress Endereço Completo
帮助方法
如果存在[DisplayAttribute]
,这将检索已翻译的显示名称。如果没有,只需要财产的名称。
private static string GetPropertyName(PropertyInfo prop)
{
var displayAttribute = prop.GetCustomAttribute<DisplayAttribute>();
if (displayAttribute != null)
{
// GetName() fetches from the resource file of the current Thread Culture
return displayAttribute.GetName();
}
else
{
return prop.Name;
}
}
示例用法获取属性名称列表
public static void Main(string[] args)
{
// Uncomment to get the names in Portuguese
//Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT");
Type type = typeof(User);
var propertyList = type.GetProperties()
.Where(prop => prop.PropertyType == typeof(string))
.Select(prop => GetPropertyName(prop)).ToList();
foreach (string propertyName in propertyList)
{
Console.WriteLine(propertyName);
}
}
唯一需要注意的是,默认情况下,资源文件类是作为internal
类生成的,您可能需要将其公开。您可以通过将Visual Studio的“属性”窗口中的“自定义工具”设置为PublicResXFileCodeGenerator
来完成此操作。否则,您可能会收到错误消息“在资源文件中找不到公共属性FirstName”。
答案 1 :(得分:0)
如果右键单击SQL Server Management Studio中的表或列,并选择属性,您将看到有一个扩展属性选项。您可以为每列添加一个名为Friendly Name的扩展属性,然后有一个单独的查询来在应用程序启动时加载您的字典。
这是一个查询,可以帮助您为数据库中的列提取扩展属性。
SELECT major_id, minor_id, t.name AS [Table Name], c.name AS [Column Name], value AS [Extended Property], ep.name as [Property Name]
FROM sys.extended_properties AS ep
INNER JOIN sys.tables AS t ON ep.major_id = t.object_id
INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id
WHERE class = 1;
从以下网址肆无忌惮地偷走的例子(我不假装记住这些东西): http://technet.microsoft.com/en-us/library/ms186989(v=SQL.105).aspx