“如果object为null,则为null;如果object为null,则为object.member”的快捷方式

我正在尝试编写一个通用的扩展方法,让我这样做:

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

NullOrPropertyOf()null对象上使用(例如,如果startDateXAttributenull ),则返回null ,如果它不为null ,则返回Func的结果。

这种扩展方法会是什么样的?

没有简短的表格; 实现一个是一个相当频繁请求的function。 语法可能类似于:

 x = foo.?bar.?baz; 

也就是说,如果foo或foo.bar为null,则x为null;如果它们都不为null,则为foo.bar.baz的结果。

我们认为它适用于C#4,但它没有使它在优先级列表的顶部附近。 对于假设的语言未来版本,我们会记住这一点。

更新:C#6将具有此function。 有关设计注意事项的讨论,请参见http://roslyn.codeplex.com/discussions/540883 。

XAttribute类为此提供了一个显式转换运算符 :

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

对于一般情况,最好的选择可能是:

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

这是你在找什么? 如果你传递一个不可为空的值类型,我认为它会崩溃,但是当你使用可空类型时它应该可以工作。 如果有什么我忽略了,请告诉我。

 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)); } }