System.ComponentModel.DescriptionAttribute in portable class
本文关键字:portable class in DescriptionAttribute ComponentModel System | 更新日期: 2023-09-27 18:32:16
我在枚举中使用描述属性为枚举字段提供用户友好名称。
public enum InstallationType
{
[Description("Forward of Bulk Head")]
FORWARD = 0,
[Description("Rear of Bulk Head")]
REAR = 1,
[Description("Roof Mounted")]
ROOF = 2,
}
使用一个很好的帮助方法可以轻松访问它:
public static string GetDescriptionFromEnumValue(Enum value)
{
DescriptionAttribute attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.SingleOrDefault() as DescriptionAttribute;
return attribute == null ? value.ToString() : attribute.Description;
}
我需要将其转换为可移植的类库,但它似乎无法访问System.ComponentModel库。 当我尝试添加敬畏时,VS告诉我我已经引用了所有内容。
谢谢
由于DescriptionAttribute
不适用于可移植类库,因此需要使用另一个属性。可用于可移植类库的命名空间System.ComponentModel.DataAnnotations
提供了可以改用的属性 DisplayAttribute。
public enum InstallationType
{
[Display(Description="Forward of Bulk Head")]
FORWARD = 0,
[Display(Description="Rear of Bulk Head")]
REAR = 1,
[Display(Description="Roof Mounted")]
ROOF = 2,
}
您的方法需要更改为
public static string GetDescriptionFromEnumValue(Enum value)
{
DisplayAttribute attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(DisplayAttribute ), false)
.SingleOrDefault() as DisplayAttribute ;
return attribute == null ? value.ToString() : attribute.Description;
}
某些内容是否可用于可移植类库取决于你为库选择的框架 - 你只得到严格的交集。但是,很可能此属性根本不存在于您的目标框架之一中。在这种情况下,一个选项是添加您自己的 - 然后您知道它是可用的。例如:
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class EnumDescriptionAttribute :Attribute
{
private readonly string description;
public string Description { get { return description; } }
public EnumDescriptionAttribute(string description)
{
this.description = description;
}
}
enum Foo
{
[EnumDescription("abc")]
A,
[EnumDescription("def")]
B
}
请注意,我故意没有在此处包含其他序列化解释器,因为这些解释器也依赖于并非所有框架都可用的功能。将代码从使用 [Description]
/DescriptionAttribute
更改为 [EnumDescription]
/EnumDescriptionAttribute
应该相当简单。
尝试在可移植库中检索枚举的属性:
public static class EnumsHelper
{
public static T GetAttributeOfType<T>(this Enum enumVal) where T : Attribute
{
var typeInfo = enumVal.GetType().GetTypeInfo();
var v = typeInfo.DeclaredMembers.First(x => x.Name == enumVal.ToString());
return v.GetCustomAttribute<T>();
}
}
更新:您还应该声明新属性(看起来像 DescriptionAttribute 在 PCL 中不可用),例如 next:
public class MyDescriptionAttribute : Attribute
{
public virtual string Text { get; set; }
}
并在枚举助手类中添加一个方法:
public static class EnumsHelper
{
...
public static string GetDescription(this Enum enumVal)
{
var attr = GetAttributeOfType<MyDescriptionAttribute>(enumVal);
return attr != null ? attr.Text : string.Empty;
}
}
如果你有下一个枚举:
public enum InstallationType
{
[MyDescription(Text = "Forward of Bulk Head")]
FORWARD = 0
}
您可以使用如下代码检索说明:
static void Main(string[] args)
{
var it = InstallationType.FORWARD;
var description = it.GetDescription();
Console.WriteLine(description);
}