Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用c#扩展从枚举获取枚举描述属性

使用c#扩展从枚举获取枚举描述属性
EN

Stack Overflow用户
提问于 2019-07-05 03:28:28
回答 2查看 476关注 0票数 2

我有一个问题,我有一个简单的枚举,在c#中有一个描述属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum Service 
{
    [Description("Unknown")]
    Unknown = 0
}

不,我在f#中有一个扩展,可以得到这样的描述,看起来如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[<Extension>]
static member inline GetEnumDescription(enum:'TEnum when 'TEnum :> Enum) : string =      

    try
        let attributes : seq<DescriptionAttribute[]> = enum.GetType().GetField(enum.ToString()).GetCustomAttributes(typedefof<DescriptionAttribute>, false) |> Seq.cast<DescriptionAttribute[]>             

        match attributes |> Seq.length > 0 with
            | true -> 
                let attribute : DescriptionAttribute = enum |> Seq.head
                attribute.Description
            | _ -> enum.ToString()
    with 
        | :? EnumException as ex -> 
            EnumExtensions._logger.Error(sprintf "Exception in getting enum description - %s" ex.Message)
            enum.ToString()

因此,c#中的元数据如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [CompilationMapping(SourceConstructFlags.ObjectType)]
public class EnumExtensions
{
    public EnumExtensions();

    public static string GetEnumDescription<TEnum>(this TEnum @enum) where TEnum : Enum, IEnumerable<DescriptionAttribute>;
}

现在,当我尝试在c#调用中使用它时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public string Description => Service.GetEnumDescription(); //Service is set to Unknown enum value

我得到的东西是:

错误CS0315类型'Enums.Service‘不能用作泛型类型或方法'EnumExtensions.GetEnumDescription(TEnum)’中的类型参数'TEnum‘。不存在从“Enums.Service”到“System.Collection s.Generic.IEnDigable”的装箱转换。

我对此感到迷茫。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-05 09:13:49

我也无法让它工作,但是您可以重写F#方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[<Extension>]
type Extensions =
    [<Extension>]
    static member inline GetEnumDescription(enum:'TEnum when 'TEnum :> Enum) : string =      

        let attributes = enum.GetType().GetField(enum.ToString()).GetCustomAttributes(typeof<DescriptionAttribute>, false)
        match attributes.Length with
        | x when x > 0 -> attributes.[0] |> (fun a -> a :?> DescriptionAttribute) |> fun a -> a.Description
        | _ -> raise (InvalidOperationException("DescriptionAttribute is missing"))

然后,当从DescriptionAttributes调用C#时,您将从C#获得Description属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  string result = Service.Unknown.GetEnumDescription();
  Console.WriteLine(result);
票数 2
EN

Stack Overflow用户

发布于 2019-07-05 04:31:46

据我所知,这里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let attribute : DescriptionAttribute = enum |> Seq.head

你对待enum就像对待序列一样,试图提取它的头部。这导致F#期望enum为序列类型,因此发出的C#元对TEnum具有IEnumerable<DescriptionAttribute>约束。我想这句话应该是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let attribute : DescriptionAttribute = attributes |> Seq.head
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56902223

复制
相关文章
C#枚举描述获取
public static class EnumExtension { public static string GetDescription(this Enum value) { FieldInfo field = value.GetType().GetField(value.ToString()); DescriptionAttribute attribute = Attribute.GetCustomAttrib
guokun
2020/09/03
5700
带描述枚举值获取枚举实例
import java.util.LinkedHashMap; /** * 是否 * 1-是 0-否 * <br>表.字段 * <br>table.column */ public enum YesOrNoEnum { /** 1-是 */ YES("1", "是"), /** 0-否 */ NO("0", "否"), ; public final String value; public final String desc;
林万程
2020/06/02
1.5K0
c#枚举的描述和值
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication15 { class Program { public static
用户1055830
2018/05/28
8730
C# 枚举在属性中运用
//默认ZFLText属性值为"Label"  [DefaultValue(typeof(DisplayMode), "Label")]  public DisplayMode ZFLText   {       get;       set;   } [Serializable]     public enum DisplayMode     {         /// <summary>         /// 显示文本         /// </summary>         Label,   
跟着阿笨一起玩NET
2018/09/18
2.3K0
C# 枚举在属性中运用
Java双属性枚举使用
最近有小伙伴问我,双枚举类该怎么写,还得包括根据key取值方法。 于是就手写一个案例如下:
执笔记忆的空白
2020/12/24
1.2K0
给系统类扩展属性(枚举)或方法
在这里我以UIButton为例子给大家展示一种实现方法,主要依靠runtime实现。废话不说上码... 1.扩展一般属性NSString @interface UIButton (CJButtonType) @property (nonatomic, strong) NSString *typeString; @end /////////////////////////////////////////////// #import "UIButton+CJButtonType.h" #import <objc
developerbfl
2018/06/05
9850
TS基础之枚举扩展知识——位枚举
大家好!我是法医,一只治疗系前端码猿🐒,与代码对话,倾听它们心底的呼声,期待着大家的点赞👍与关注➕。新手一枚,希望能和大家共同成长,若文章存在哪些不足的地方,欢迎大佬们多提建议 🙉 枚举扩展知识——位枚举 位枚举也可以叫枚举位运算,这里的位枚举针对的是数字枚举,字符串枚举是不行的,这里举个栗子🌰来说明位运算,我们都知道一个文件有很多操作权限,可读、可写、可创建、可删除,权限有对应的取值,这里是数字,不能超过这个范围,如下: enum Permission{ Read, Write,
程序员法医
2022/08/11
8640
C# 遍历枚举
但是这个方法的性能比较差,可以使用一个库。首先打开 Nuget 安装 Enums.NET
林德熙
2018/09/19
1.1K0
C# 遍历枚举
C# 遍历枚举
但是这个方法的性能比较差,可以使用一个库。首先打开 Nuget 安装 Enums.NET
林德熙
2022/08/04
4670
C#遍历枚举
这是一个常用到的问题,例如将枚举绑定到一个DropdownList…… 我是这样实现的: public enum BusinessTable { 商店 = 2, 厂商 = 4, }   遍历(在遍历的时候将值添加到一个Dropdownlist上): this.ddl业务表名.Items.Add(new ListItem("--请选择--", "")); foreach (Entity.Common.BusinessTable bt i
拓荒者IT
2019/09/26
7780
C#枚举中使用Flags特性
这种用处很大,比如权限、执行状态等,都可以用一个int型保存到数据库中,C#中使用枚举可以处理这个问题。
拓荒者IT
2019/09/26
6860
C#枚举中使用Flags特性
如果对一个值可以包含多个,那么可以使用枚举,加上Flags 本文告诉大家如何写一个 Flags。
林德熙
2022/08/04
2490
怎么获取枚举的值_枚举是值类型吗
最近在做一个学校的系统,其中用到一些枚举,可是在显示下拉列表时要绑定枚举的描述及其枚举值时就只一个一个的默认设死,这样不灵活。有没有其快捷方法?搜了下百度很多相关资料有了些许眉目,代码如下
全栈程序员站长
2022/09/20
4.5K0
USB 描述符和 USB 枚举
Host 使用控制传输来识别设备、设置设备地址、启动设备的某些特性,对于控制传输,它首先发出"setup 事务",如下:
Jasonangel
2023/08/22
6850
USB 描述符和 USB 枚举
转向Kotlin——枚举类和扩展
Kotlin中的枚举类和Java中的枚举类型非常相似,具有类的特性。一般将可枚举的同类型的一组值作为枚举类定义。
蜻蜓队长
2018/08/03
1.4K0
C#的“智能枚举”:在枚举中增加行为?
在这个示例中,我们定义了一个名为 Weekday 的枚举,其中包括每个星期的日子。然后在 Main 方法中,我们将 today 变量设置为 Tuesday,并使用 ToString() 方法将其转换为字符串。
郑子铭
2023/08/30
4060
C#的“智能枚举”:在枚举中增加行为?
TypeScript入门——扩展类型之枚举
在上一篇文章中聊到了很多TS基础类型,那为什么又出现了扩展类型枚举,我们都知道任何东西都不是平白无故就出现的,都是为了解决特定的问题。枚举只是扩展类型其中之一,比如说还有类型别名,接口,类
程序员法医
2022/08/11
9930
TypeScript入门——扩展类型之枚举
c# 枚举之间的转换
枚举在C#中都会用到,但是你是否想过,枚举之间怎么转换?这篇文章我就来说一下枚举之间的转换。 C# 是不支持不同枚举之间的转换的,但是 CLR 支持,因此我们可以利用 CLR 赋值的兼容性来实现枚举之间的转换。看一下代码你就明白了:
喵叔
2020/09/08
7540
C# 枚举转字符串 枚举转字符串字符串转枚举
如果把一个枚举转字符串,那么如何把字符串转枚举?可以使用 Enum.Parse 不过这个方法可以会抛异常,所以使用需要知道字符串是可以转
林德熙
2018/09/18
4K0
从暴力枚举用户到获取域所有信息
我们在进行内网渗透中,会遇到存在 windows 域环境的情况,当我们获得一个内网主机权限之后,这个主机可能没有加入域,我们无法直接通过在这个主机上获取域中的相关信息,这是如何进行域渗透呢?
信安之路
2018/08/08
2.8K0
从暴力枚举用户到获取域所有信息

相似问题

使用枚举的描述属性获取枚举的值

10

从枚举属性获取枚举

73

获取枚举*子集的描述属性*

13

使用枚举描述的属性

20

如何从value中获取C#枚举描述?

55
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文