如何通过传入枚举值和属性类型来获取枚举的自定义属性?
How to get a custom attribute on enum by passing in the enum value and attribute type?
网上有很多创建枚举扩展方法的示例,该方法将枚举值作为参数并在该方法中获取特定属性,如下所示:
namespace MVVMProj.ProjUtilities
{
public class EnumerationHelpers
{
public static string GetStatusText(this Enum value)
{
var type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null) { return null; }
var field = type.GetField(name);
if (field == null) { return null; }
var attr = Attribute.GetCustomAttribute(field, typeof(StatusTextAttribute)) as StatusTextAttribute;
if (attr == null) { return null; }
return attr.StatusText;
}
}
}
我想知道的是,有没有办法将属性类型也传递给方法,这样我就不需要为每个不同的属性编写特定的方法了?
这是未完成的,但是,它应该让您了解我正在努力实现的目标:
namespace MVVMProj.ProjUtilities
{
public class EnumerationHelpers
{
public static string GetCustomAttribute(this Enum value, Type customAttr)
//Or instead of passing a Type, a string of the attribute's name
{
var type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null) { return null; }
var field = type.GetField(name);
if (field == null) { return null; }
var attr = Attribute.GetCustomAttribute(field, ....) as ....;
if (attr == null) { return null; }
return attr....;
}
}
}
我想我不能只 return 一个字符串,因为它可以是任何数据类型。
也许是一些通用方法?
如有任何建议,我们将不胜感激!
编辑:用法:
它正在遍历枚举以创建字典,因此我可以在组合框中显示值。它仅在属性与 if 语句中的条件匹配时才添加项目。
还有一点要注意,自定义属性也是一个枚举。
Aybe:'item' 只是迭代中的一个对象,所以我进行了转换。虽然我在 if 语句中遇到错误,它试图将 CaseTypeAttribute 与实际的 CaseType 枚举值进行比较,但我需要做什么来解决?
错误:
严重性代码描述项目文件行抑制状态
错误 CS0019 运算符“==”不能应用于 'SBC.CaseTypeAttribute' 和 'SBC.CaseType'
类型的操作数
private Dictionary<int, string> _substancetypes;
public Dictionary<int, string> SubstanceTypes
{
get
{
if (_substancetypes == null)
{
_substancetypes = new Dictionary<int, string>();
foreach (var item in Enum.GetValues(typeof(SBC.SubstanceTypeCode)))
{
var descriptionAttribute = ((SBC.SubstanceTypeCode)item).GetAttribute<SBC.CaseTypeAttribute>();
if (descriptionAttribute != null &&
descriptionAttribute == SBC.CaseType.Exposures) //Error here
{
_substancetypes.Add((int)item, CTS_MVVM.CTS_Utilities.EnumerationHelpers.GetDescriptionFromEnumValue((SBC.SubstanceTypeCode)item));
}
}
}
return _substancetypes;
}
}
是这样的吗?
using System;
using System.ComponentModel;
using System.Reflection;
namespace ConsoleApp1
{
internal static class Program
{
private static void Main(string[] args)
{
var descriptionAttribute = MyEnum.A.GetAttribute<DescriptionAttribute>();
}
}
public static class EnumExtensions
{
public static T GetAttribute<T>(this Enum @enum) where T : Attribute
{
var type = @enum.GetType();
var name = Enum.GetName(type, @enum);
var field = type.GetField(name);
var attribute = field.GetCustomAttribute<T>();
return attribute;
}
}
public enum MyEnum
{
[Description("A")] A,
[Description("B")] B
}
}
网上有很多创建枚举扩展方法的示例,该方法将枚举值作为参数并在该方法中获取特定属性,如下所示:
namespace MVVMProj.ProjUtilities
{
public class EnumerationHelpers
{
public static string GetStatusText(this Enum value)
{
var type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null) { return null; }
var field = type.GetField(name);
if (field == null) { return null; }
var attr = Attribute.GetCustomAttribute(field, typeof(StatusTextAttribute)) as StatusTextAttribute;
if (attr == null) { return null; }
return attr.StatusText;
}
}
}
我想知道的是,有没有办法将属性类型也传递给方法,这样我就不需要为每个不同的属性编写特定的方法了?
这是未完成的,但是,它应该让您了解我正在努力实现的目标:
namespace MVVMProj.ProjUtilities
{
public class EnumerationHelpers
{
public static string GetCustomAttribute(this Enum value, Type customAttr)
//Or instead of passing a Type, a string of the attribute's name
{
var type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null) { return null; }
var field = type.GetField(name);
if (field == null) { return null; }
var attr = Attribute.GetCustomAttribute(field, ....) as ....;
if (attr == null) { return null; }
return attr....;
}
}
}
我想我不能只 return 一个字符串,因为它可以是任何数据类型。
也许是一些通用方法?
如有任何建议,我们将不胜感激!
编辑:用法:
它正在遍历枚举以创建字典,因此我可以在组合框中显示值。它仅在属性与 if 语句中的条件匹配时才添加项目。
还有一点要注意,自定义属性也是一个枚举。
Aybe:'item' 只是迭代中的一个对象,所以我进行了转换。虽然我在 if 语句中遇到错误,它试图将 CaseTypeAttribute 与实际的 CaseType 枚举值进行比较,但我需要做什么来解决?
错误:
严重性代码描述项目文件行抑制状态
错误 CS0019 运算符“==”不能应用于 'SBC.CaseTypeAttribute' 和 'SBC.CaseType'
private Dictionary<int, string> _substancetypes;
public Dictionary<int, string> SubstanceTypes
{
get
{
if (_substancetypes == null)
{
_substancetypes = new Dictionary<int, string>();
foreach (var item in Enum.GetValues(typeof(SBC.SubstanceTypeCode)))
{
var descriptionAttribute = ((SBC.SubstanceTypeCode)item).GetAttribute<SBC.CaseTypeAttribute>();
if (descriptionAttribute != null &&
descriptionAttribute == SBC.CaseType.Exposures) //Error here
{
_substancetypes.Add((int)item, CTS_MVVM.CTS_Utilities.EnumerationHelpers.GetDescriptionFromEnumValue((SBC.SubstanceTypeCode)item));
}
}
}
return _substancetypes;
}
}
是这样的吗?
using System;
using System.ComponentModel;
using System.Reflection;
namespace ConsoleApp1
{
internal static class Program
{
private static void Main(string[] args)
{
var descriptionAttribute = MyEnum.A.GetAttribute<DescriptionAttribute>();
}
}
public static class EnumExtensions
{
public static T GetAttribute<T>(this Enum @enum) where T : Attribute
{
var type = @enum.GetType();
var name = Enum.GetName(type, @enum);
var field = type.GetField(name);
var attribute = field.GetCustomAttribute<T>();
return attribute;
}
}
public enum MyEnum
{
[Description("A")] A,
[Description("B")] B
}
}