“如果object为null,则为null;如果object为null,则为object.member”的快捷方式
我正在尝试编写一个通用的扩展方法,让我这样做:
this.startDate = startDateXAttribute.NullOrPropertyOf(() => { return DateTime.Parse(startDateXAttribute.Value); });
NullOrPropertyOf()
在null
对象上使用(例如,如果startDateXAttribute
为null
),则返回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)); } }