我有一个问题,我有一个简单的枚举,在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
我得到的东西是:
错误CS0315类型'Enums.Service‘不能用作泛型类型或方法'EnumExtensions.GetEnumDescription(TEnum)’中的类型参数'TEnum‘。不存在从“Enums.Service”到“System.Collection s.Generic.IEnDigable”的装箱转换。
我对此感到迷茫。
发布于 2019-07-05 09:13:49
我也无法让它工作,但是您可以重写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"))
然后,当从DescriptionAttributes
调用C#时,您将从C#获得Description属性:
string result = Service.Unknown.GetEnumDescription();
Console.WriteLine(result);
发布于 2019-07-05 04:31:46
据我所知,这里:
let attribute : DescriptionAttribute = enum |> Seq.head
你对待enum
就像对待序列一样,试图提取它的头部。这导致F#期望enum
为序列类型,因此发出的C#元对TEnum
具有IEnumerable<DescriptionAttribute>
约束。我想这句话应该是
let attribute : DescriptionAttribute = attributes |> Seq.head
https://stackoverflow.com/questions/56902223
复制