我有一个问题,我在 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/