Raccourci pour «null si l’object est null ou object.member si l’object n’est pas null»

J’essaie d’écrire une méthode d’extension générique qui me permet de faire ceci:

this.startDate = startDateXAtsortingbute.NullOrPropertyOf(() => { return DateTime.Parse(startDateXAtsortingbute.Value); }); 

NullOrPropertyOf() renverrait null s’il est utilisé sur un object null (par exemple si startDateXAtsortingbute était null ), ou renverrait le résultat d’un Func s’il n’est pas null.

À quoi ressemblerait cette méthode d’extension?

Il n’y a pas de forme abrégée pour cela; sa mise en oeuvre est une fonctionnalité assez fréquemment demandée. La syntaxe pourrait être quelque chose comme:

 x = foo.?bar.?baz; 

C’est-à-dire que x est null si foo ou foo.bar sont nuls et le résultat de foo.bar.baz si aucun d’entre eux n’est null.

Nous l’avions envisagée pour le n ° 4, mais cela ne l’a pas fait figurer en haut de la liste des priorités. Nous garderons cela à l’esprit pour les futures versions hypothétiques du langage.

UPDATE: C # 6 aura cette fonctionnalité. Voir http://roslyn.codeplex.com/discussions/540883 pour une discussion des considérations de conception.

La classe XAtsortingbute fournit un opérateur de conversion explicite pour cela:

 XAtsortingbute startDateXAtsortingbute = // ... DateTime? result = (DateTime?)startDateXAtsortingbute; 

Pour le cas général, la meilleure option est probablement la suivante:

 DateTime? result = (obj != null) ? (DateTime?)obj.DateTimeValue : null; 

Est-ce ce que vous cherchez? Je pense que cela tombe en panne si vous passez un type de valeur non nullable, mais cela devrait fonctionner lorsque vous utilisez des types nullable. S’il vous plaît laissez-moi savoir s’il y a quelque chose que j’ai oublié.

 public static class Extension { public static T NullOrPropertyOf(this XAtsortingbute atsortingbute, Func converter) { if (atsortingbute == null) { return default(T); } return converter.Invoke(atsortingbute.Value); } } class Program { static void Main(ssortingng[] args) { Func convertDT = (ssortingng str) => { DateTime datetime; if (DateTime.TryParse(str, out datetime)) { return datetime; } return null; }; Func convertStr = (ssortingng str) => { return str; }; XAtsortingbute x = null; Console.WriteLine(x.NullOrPropertyOf(convertStr)); Console.WriteLine(x.NullOrPropertyOf(convertDT)); XName t = "testing"; x = new XAtsortingbute(t, "test"); Console.WriteLine(x.NullOrPropertyOf(convertStr)); x = new XAtsortingbute(t, DateTime.Now); Console.WriteLine(x.NullOrPropertyOf(convertDT)); } }