2009-09-06 1 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, byte, int, long , double, 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

+0

Возможно, «где T: struct, IConvertible» тогда? Используйте оба предложения? –

+0

@Matt, Спасибо за идеи, но я думаю, что я понял это сейчас (см. Править и отвечать). Я могу так же легко сделать актерский состав, где я называю метод расширения, который, я думаю, более ясен в любом случае. – devuxer

3

Я не уверен, что вы здесь пытаетесь сделать ... единственными типами, которые не являются нулевыми, являются типы значений, а XElement - ссылочный тип. Поэтому не имеет смысла бросать его на Nullable<T> ...

+0

true, даже если вы можете пройти мимо общей ошибки, он взорвется на литье. –

+0

XElement имеет явные отбрасывания для всех типов значений и типов Nullable . См. Http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.op_explicit.aspx. Итак, я подумал, что могу использовать это как-то с общим. Вы говорите, что это невозможно? – devuxer

+0

@ Dan: Это много, но не все типы значений. Общий метод должен быть общим действительным действием для всех типов, с которыми он может быть создан, что означает, что XElement должен был бы предоставить один общий метод литья, который вы могли бы назвать. Это та же самая причина, по которой XElement использует около 20 различных методов для своих явных отливок вместо предоставления общего. –