2009-09-06 4 views
0

J'essaye de convertir un XElement en null ou n'importe quel type T est fourni.Quelqu'un peut-il aider avec cette méthode d'extension générique?

Voici ce que j'ai jusqu'à présent:

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

Erreur:

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>

cela peut être fait ou dois-je écrire une extension séparée pour bool, byte, int, long , double, decimal, etc.

Modifier

je ne l'ai utilisé pour les médicaments génériques du tout. Voir ma réponse ci-dessous.

Répondre

1

D'accord, je l'ai maintenant. Je n'avais pas besoin d'utiliser de génériques du tout. Je peux juste le laisser comme un XElement et faire le cast où j'appelle la méthode d'extension.

Donc, mon code révisé ressemble à ceci:

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

Exemple d'utilisation:

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

Utilisez where T : struct afin que votre méthode soit limitée aux types de valeurs (pour lesquels Nullable n'a de sens que pour).

+0

Merci, mais ne fonctionne pas. Je reçois "Impossible de convertir' XElement' en 'T'". – devuxer

+0

Peut-être "où T: struct, IConvertible" alors? Utilisez les deux clauses? –

+0

@Matt, Merci pour les idées, mais je pense que je l'ai compris maintenant (voir modifier et répondre). Je peux tout aussi bien faire le casting là où j'appelle la méthode d'extension, ce que je trouve plus clair quand même. – devuxer

3

Je ne suis pas sûr de ce que vous essayez de faire ici ... les seuls types non valables sont les types de valeur, et XElement est un type de référence. Donc, ça n'a pas de sens de le lancer à un Nullable<T> ...

+0

vrai, même si vous pouvez passer l'erreur générique, il va exploser sur la distribution. –

+0

Un XElement a des conversions explicites pour tous les types de valeur et les types Nullable. Voir http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.op_explicit.aspx. Donc, j'ai pensé que je pourrais exploiter cela d'une manière ou d'une autre avec un générique. Êtes-vous en train de dire que c'est impossible? – devuxer

+0

@Dan: C'est beaucoup, mais pas tous les types de valeur. Une méthode générique doit être une action valide commune pour tous les types avec lesquels elle peut être instanciée, ce qui signifie que XElement doit fournir une méthode générique unique que vous pouvez appeler. C'est la même raison pour laquelle XElement utilise 20 méthodes différentes pour ses distributions explicites au lieu d'en fournir une générique. –

Questions connexes