【问题标题】:Can someone help with this generic extension method?有人可以帮助使用这种通用扩展方法吗?
【发布时间】:2009-09-06 23:12:48
【问题描述】:

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

这是我目前所拥有的:

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

错误:

T 类型必须是不可为空的值类型,才能将其用作泛型类型或方法System.Nullable&lt;T&gt; 中的参数T

可以这样做还是我必须为boolbyteintlongdoubledecimal 等编写单独的扩展?

编辑

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

【问题讨论】:

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


    【解决方案1】:

    我不确定您要在这里做什么...唯一不可为空的类型是值类型,而 XElement 是引用类型。所以将其转换为Nullable&lt;T&gt; 是没有意义的...

    【讨论】:

    • 是的,即使你能克服一般错误,它也会在演员阵容中爆炸。
    • XElement 对所有值类型和 Nullable 类型都有显式强制转换。见msdn.microsoft.com/en-us/library/…。所以,我想我可以用一个通用的方法来利用它。你是说这不可能吗?
    • @Dan:有很多,但不是所有的值类型。泛型方法必须是可以实例化的所有类型的通用有效操作,这意味着 XElement 必须提供一个可以调用的泛型转换方法。这也是 XElement 使用大约 20 种不同方法进行显式转换而不是提供通用方法的原因。
    • 谢谢你们的帮助,伙计们。我想我现在知道了(请参阅我的编辑和答案)。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,但不起作用。我收到“无法将 XElement 转换为 T”。
    • 也许是“哪里 T : struct, IConvertible”呢?使用这两个子句?
    • @Matt,感谢您的想法,但我想我现在已经弄清楚了(请参阅编辑和答案)。我可以很容易地在调用扩展方法的地方进行强制转换,无论如何我认为这更清楚。
    【解决方案3】:

    好的,我现在明白了。我根本不需要使用泛型。我可以将其保留为 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多