【问题标题】:Shortcut for "null if object is null, or object.member if object is not null" [duplicate]“如果对象为空,则为空,如果对象不为空,则为 object.member”的快捷方式 [重复]
【发布时间】:2010-09-29 00:17:53
【问题描述】:

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

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

如果NullOrPropertyOf() 用于null 对象(例如,如果startDateXAttributenull),NullOrPropertyOf() 将返回null,如果不为空,则返回Func 的结果。

这个扩展方法会是什么样子?

【问题讨论】:

标签: c# generics


【解决方案1】:

没有简短的形式;实现一个是相当频繁要求的功能。语法可能类似于:

x = foo.?bar.?baz;

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

我们在 C# 4 中考虑过它,但它并没有使其靠近优先级列表的顶部。对于该语言的假设未来版本,我们会牢记这一点。

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

【讨论】:

  • 假设的?我希望 MS 不会这么快放弃 C# ;)
  • @vc:我提醒大家,Eric 对未宣布的未来产品的假设特征的思考,这些产品今天不存在,也可能永远不会存在,仅用于娱乐目的,并不构成任何承诺随时提供具有任何功能的任何产品。
  • 你是我对谨慎的定义
  • @Eric:恭喜。你听起来像个律师!
  • @nawfal:好点。
【解决方案2】:

XAttribute Class 为此提供了一个explicit conversion operator

XAttribute startDateXAttribute = // ...

DateTime? result = (DateTime?)startDateXAttribute;

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 在lhs上写下参数类型就不需要指定lambda的参数类型了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多