首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用c#扩展从枚举获取枚举描述属性

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
[<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
运行
复制
 [CompilationMapping(SourceConstructFlags.ObjectType)]
public class EnumExtensions
{
    public EnumExtensions();

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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 17:13:49

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

代码语言:javascript
代码运行次数:0
运行
复制
[<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
运行
复制
  string result = Service.Unknown.GetEnumDescription();
  Console.WriteLine(result);
票数 2
EN

Stack Overflow用户

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

据我所知,这里:

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

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

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

https://stackoverflow.com/questions/56902223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档