我有以下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#中重写这个?
答案 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