簡體   English   中英

使用f#擴展從c#中獲取枚舉描述屬性

[英]Get enum description attribute from enum in c# using f# extension

我有一個問題我在c#中有一個帶有描述屬性的簡單枚舉

public enum Service 
{
    [Description("Unknown")]
    Unknown = 0
}

不,我在f#中有擴展名來獲取我的描述,它看起來像:

[<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#中的meta看起來像:

 [CompilationMapping(SourceConstructFlags.ObjectType)]
public class EnumExtensions
{
    public EnumExtensions();

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

現在當我嘗試在c#調用中使用它時:

public string Description => Service.GetEnumDescription(); //Service is set to Unknown enum value

我得到的東西是這樣的:

錯誤CS0315類型'Enums.Service'不能在泛型類型或方法'EnumExtensions.GetEnumDescription(TEnum)'中用作類型參數'TEnum'。 沒有從'Enums.Service'到'System.Collections.Generic.IEnumerable'的裝箱轉換。

我迷失了。

據我所知,這里:

let attribute : DescriptionAttribute = enum |> Seq.head

你把enum當作一個序列來對待,試圖提取它的頭部。 這導致F#期望enum為序列類型,因此發出的C#meta在TEnum上具有IEnumerable<DescriptionAttribute>約束。 我猜這行應該是

let attribute : DescriptionAttribute = attributes |> Seq.head

我也無法讓它工作,但你可以重寫F#方法:

[<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"))

然后你會得到從Description屬性DescriptionAttributes從C#調用時:

  string result = Service.Unknown.GetEnumDescription();
  Console.WriteLine(result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM