可移植类库中的System.ComponentModel.DescriptionAttribute

我在枚举中使用Description属性为枚举字段提供用户友好名称。 例如

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 } 

请注意,我故意没有在此处包含其他序列化构造函数,因为它们也依赖于所有框架都不具备的function。 将代码从[Description] / DescriptionAttribute更改为[EnumDescription] / EnumDescriptionAttribute应该相当简单。

尝试使用此方法检索可移植库中枚举的属性:

 public static class EnumsHelper { public static T GetAttributeOfType(this Enum enumVal) where T : Attribute { var typeInfo = enumVal.GetType().GetTypeInfo(); var v = typeInfo.DeclaredMembers.First(x => x.Name == enumVal.ToString()); return v.GetCustomAttribute(); } } 

更新 :您还应该声明新属性(看起来像在PCL中不可用的DescriptionAttribute),例如下一个:

 public class MyDescriptionAttribute : Attribute { public virtual string Text { get; set; } } 

并在EnumsHelper类中添加一个方法:

 public static class EnumsHelper { ... public static string GetDescription(this Enum enumVal) { var attr = GetAttributeOfType(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); }