有人可以帮助这种通用的扩展方法吗?

时间:2009-09-06 23:12:49

标签: c# generics linq-to-xml extension-methods

我正在尝试将XElement转换为null或提供的任何类型T

这是我到目前为止所拥有的:

public static T? ConvertToNullable<T>(this XElement element) where T : IConvertible
{
    if (element.IsNill())
        return null;
    else
        return (T)element;
}

错误:

  

类型T必须是非可空值类型,才能在泛型类型或方法T

中将其用作参数System.Nullable<T>

可以这样做,还是必须为boolbyteintlongdouble,{{1等等?

修改

我根本不应该使用泛型。请参阅下面的答案。

3 个答案:

答案 0 :(得分:3)

我不确定你在这里尝试做什么...唯一不可为空的类型是值类型,而XElement是引用类型。因此将其转换为Nullable<T> ...

是没有意义的

答案 1 :(得分:2)

使用where T : struct,以便您的方法仅限于值类型(Nullable只对其有意义)。

答案 2 :(得分:1)

好的,我现在明白了。我根本不需要使用泛型。我可以把它留作XElement并在我称之为扩展方法的地方进行转换。

所以,我修改后的代码如下所示:

public static XElement NullIfNill(this XElement element)
{
    if (element.IsNill())
        return null;
    else
        return element;
}

用法示例:

var results =
    from
        p in participants.Elements()
    join
        co in conditionOrders.Elements()
        on (int?)p.Element(NS + "conditionOrderId").NullIfNill() equals (int)co.Element(NS + "id")