Acceso directo para “null si el objeto es nulo, o object.member si el objeto no es nulo”

Intento escribir un método de extensión genérico que nos permita hacer esto:

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

NullOrPropertyOf() devolverá null si se usa en un objeto null (por ejemplo, si startDateXAttribute fue null ) o devuelve el resultado de un Func si no es nulo.

¿Cómo se vería este método de extensión?

No hay una forma corta para eso; implementar uno es una característica solicitada con bastante frecuencia. La syntax podría ser algo como:

 x = foo.?bar.?baz; 

Es decir, x es nulo si foo o foo.bar son nulos, y el resultado de foo.bar.baz si ninguno de ellos es nulo.

Lo consideramos para C # 4 pero no lo hizo en ningún lugar cerca de la parte superior de la lista de prioridades. Lo tendremos en cuenta para versiones futuras hipotéticas del idioma.

ACTUALIZACIÓN: C # 6 tendrá esta característica. Vea http://roslyn.codeplex.com/discussions/540883 para una discusión sobre las consideraciones de diseño.

La clase XAttribute proporciona un operador de conversión explícito para esto:

 XAttribute startDateXAttribute = // ... DateTime? result = (DateTime?)startDateXAttribute; 

Para el caso general, la mejor opción es probablemente esta:

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

Es esto lo que estás buscando? Creo que se rompe si pasa un tipo de valor que no admite nulos, pero debería funcionar cuando usa tipos que aceptan nulos. Por favor, avíseme si hay algo que he pasado por alto.

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