Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取枚举属性的通用方法(支持i18n/本地化)_C#_Wpf_Enums_Attributes_Resources - Fatal编程技术网

C# 获取枚举属性的通用方法(支持i18n/本地化)

C# 获取枚举属性的通用方法(支持i18n/本地化),c#,wpf,enums,attributes,resources,C#,Wpf,Enums,Attributes,Resources,当我寻求一个(更)现代的解决方案,在enum上使用单个属性,以便为条目的显示名称及其工具提示提供数据时,我也遇到了这样的情况 然而,a)通过在属性中使用ResourceType=typeof(和扩展方法中的ResourceManager的一个实例和b)为我指明了正确的方向 现在,如何编写一个好的、最好是通用的方法,利用较新的C语言特性来填充e。G在为每个enum条目仅使用一个属性的情况下为每个条目提供工具提示的数据下拉列表?这可能吗 答案是:是,方法是使用并利用其名称和说明属性 因为我是为WPF

当我寻求一个(更)现代的解决方案,在
enum
上使用单个属性,以便为条目的显示名称及其工具提示提供数据时,我也遇到了这样的情况

然而,a)通过在属性中使用
ResourceType=typeof(
和扩展方法中的
ResourceManager
的一个实例和b)为我指明了正确的方向

现在,如何编写一个好的、最好是通用的方法,利用较新的C语言特性来填充e。G在为每个
enum
条目仅使用一个属性的情况下为每个条目提供工具提示的数据下拉列表?这可能吗

答案是:,方法是使用并利用其
名称
说明
属性


因为我是为WPF应用程序开发的,所以我受MVVM的约束,并尽可能地追求干净、可读的代码。但正如所有代码一样:总有改进的余地。因此,如果您认为我们可以进一步改进,请随时提供反馈。

注意:代码的格式符合So的设计,不一定是典型的C行(中断)设计,因为我不喜欢水平滚动

资源文件,resources.resx

注意#1:您必须将访问修饰符(上面屏幕截图中的右上角)设置为Public,以便从其他程序集访问(在我的情况下是必需的)

注意#2:为了利用Visual Studio的多语言支持概念,本地化的资源文件必须命名为resources.xx xx.resx,e。GResources.de-de.resx

enum
QuestionType.cs

名称空间Yoda.Data.Interfaces.Enums
{
使用System.ComponentModel.DataAnnotations;
使用Yoda.Data.Interfaces.Properties;
公共枚举类型
{
[显示(Name=“问题\类型\未知\条目”,
ResourceType=typeof(资源),
Description=“问题类型未知工具提示”)]
未知=0,
[显示(Name=“问题\类型\问题\条目”,
ResourceType=typeof(资源),
Description=“问题\类型\问题\工具提示”)]
问题=1,
[显示(Name=“问题\类型\答案\条目”,
ResourceType=typeof(资源),
Description=“问题\类型\答案\工具提示”)]
答案=2
}
}
EnumExtensions.cs中的扩展方法:

名称空间Yoda.Frontend.Extensions
{
使用制度;
使用System.ComponentModel.DataAnnotations;
利用制度全球化;
使用System.Linq;
利用系统资源;
公共静态类枚举扩展
{
//如果不在其他地方使用此方法,则可以将其设置为私有
公共静态TatAttribute GetEnumAttribute(此Enum enumValue)
其中:属性
{
var memberInfo=enumValue.GetType().GetMember(enumValue.ToString());
返回memberInfo[0]。GetCustomAttributes(typeof(tatAttribute),false)
第()类
.FirstOrDefault();
}
公共静态字符串ToDescription(此枚举枚举值)
{
var displayAttribute=enumValue.GetEnumAttribute();
返回displayAttribute==null
?enumValue.ToString().Replace(““,”)
:新建ResourceManager(displayAttribute.ResourceType)
.GetString(displayAttribute.Description,CultureInfo.CurrentUICulture);
}
公共静态字符串ToName(此枚举枚举值)
{
var displayAttribute=enumValue.GetEnumAttribute();
返回displayAttribute==null
?enumValue.ToString().Replace(““,”)
:新建ResourceManager(displayAttribute.ResourceType)
.GetString(displayAttribute.Name,CultureInfo.CurrentUICulture);
}
}
//您的其他枚举扩展方法位于此处。。。
}
WPF中的一个使用示例要求2个转换器(而不是一个带参数的转换器)符合以下要求:

Name
属性转换器,QuestionTypeNameConverter.cs

名称空间Yoda.Frontend.Converters
{
使用制度;
利用制度全球化;
使用System.Windows.Data;
使用Yoda.Data.Interfaces.Enums;
使用Yoda.Frontend.Extensions;
//第二个转换器将命名为QuestionTypeDescriptionConverter
公共类QuestionTypeNameConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、,
文化信息(文化)
{
//第二个转换器将调用.ToDescription()
返回(值为QuestionType???QuestionType.Unknown).ToName();
}
公共对象转换回(对象值、类型targetType、对象参数、,
文化信息(文化)
{
返回值;
}
}
}
注意:为了您的阅读乐趣,我将我的示例限制为仅显示一个转换器类,但我已经包含了一些注释来描述第二个转换器类所需的更改

最后是MainView.xaml中的用法:


xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml"
// ... 更多xmlns和其他基本内容
xmlns:c=“clr命名空间:CAP.GUI.Converters”
//你的窗口布局在这里。。。
//你的另一个窗口布局在这里。。。

注意:代码的格式符合SO的设计,不一定是典型的C#line(break)设计,因为我不喜欢水平滚动

资源文件,resources.resx