2009-09-06 22 views
0

我试图将XElement转换为null或提供任何类型的T有人可以帮助使用这种通用的扩展方法吗?

这是我到目前为止有:

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

错误:

The type T must be a non-nullable value type in order to use it as parameter T in the generic type or method System.Nullable<T>

可以这样做或做我必须写bool一个独立的扩展,byteintlongdouble,decimal等?

编辑

我不应该使用泛型这个在所有。请参阅下面的答案。

回答

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") 
2

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

+0

谢谢,但不起作用。我得到“不能将XElement'转换为'T'”。 – devuxer 2009-09-06 23:21:53

+0

也许“where T:struct,IConvertible”呢?使用两个子句? – 2009-09-06 23:23:51

+0

@Matt,感谢您的想法,但我想我现在已经明白了(请参阅编辑和回答)。我可以轻松地做演员,我称之为扩展方法,无论如何我认为这种方法更加清晰。 – devuxer 2009-09-06 23:45:43

3

我不知道你在这里试图做什么......唯一不可为空的类型是值类型,而XElement是一个引用类型。所以它没有任何意义投到Nullable<T> ...

+0

是真的,即使你可以通过一般的错误,它会炸毁演员阵容。 – 2009-09-06 23:21:32

+0

XElement对所有的值类型和可为空的类型都有明确的强制转换。请参阅http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.op_explicit.aspx。所以,我想我可以通过一个通用的方式来进行这种操作。你说这是不可能的吗? – devuxer 2009-09-06 23:26:29

+0

@Dan:这很多,但不是所有的值类型。对于所有可以实例化的类型,泛型方法必须是一个常见的有效操作,这意味着XElement必须提供可以调用的单一通用转换方法。这就是为什么XElement使用20种不同方法进行显式转换而不是提供通用转换的原因。 – 2009-09-06 23:38:49

相关问题