如何在F#中打开泛型类型参数?

时间:2013-07-15 14:53:13

标签: c# .net generics f# functional-programming

我有以下C#代码:

public static T Attr<T>(this XElement x, string name)
    {
        var attr = x.Attribute(name);
        if (typeof(T) == typeof(int))
            return (T)(object)(attr == null ? 0 : int.Parse(attr.Value));

        if (typeof(T) == typeof(float))
            return (T)(object)(attr == null ? 0 : float.Parse(attr.Value));
        if (typeof(T) == typeof(String))
            return (T)(object)(attr == null ? "" : attr.Value);
        return (T)(object)null;
    }

我已经尝试了一个小时左右将其转换为F#但没有取得任何成功,并继续收到错误消息,例如“type int has subtype ...”让我完全糊涂了。我对:? :?>和其他运营商的动作的探索并没有给我任何成功。

我如何在F#中重写这个?

1 个答案:

答案 0 :(得分:3)

如果你想要相同的逻辑,你可以像使用C#一样使用if / else,或者为“类型转换器”定义类型的映射。但我可能会选择更简单的东西,比如:

type XElement with
  member this.Attr<'T>(name) = 
    match this.Attribute(XName.Get name) with
    | null -> Unchecked.defaultof<'T>
    | attr -> Convert.ChangeType(attr.Value, typeof<'T>) :?> 'T