c# - 使用 f# 扩展从 C# 中的枚举获取枚举描述属性

标签 c# enums f#

我有一个问题,我在 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# 中的元看起来像:

 [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

我得到类似的东西:

Error CS0315 The type 'Enums.Service' cannot be used as type parameter 'TEnum' in the generic type or method 'EnumExtensions.GetEnumDescription(TEnum)'. There is no boxing conversion from 'Enums.Service' to 'System.Collections.Generic.IEnumerable'.

我对此迷失了。

最佳答案

我也无法让它工作,但您可以将 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"))

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

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

关于c# - 使用 f# 扩展从 C# 中的枚举获取枚举描述属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902223/

相关文章:

mysql - 如何在 MySql 中选择 ENUM 类型的值数?

c++ - 比较模板类中的枚举 - 它安全吗?

c# - 从构造函数创建委托(delegate)

c# - Mono 分析器以意想不到的方式更改程序的执行

java - 为什么我收到 SPADE 无法解析为类型错误?

.net - 现有 ETW 提供程序的 System.Diagnostic.Tracing.EventListener

f# - 枚举与非成员歧视工会

f# - FsCheck如何生成元组

c# - Fluent NHibernate 不会自动映射基类中的一对多属性

c# - 按句点将字符串格式化为 3 位数字组