代码之家  ›  专栏  ›  技术社区  ›  SnickersAreMyFave

“如果对象为空,则为空”的快捷方式,或object.member成员如果对象不为null“[重复]

  •  7
  • SnickersAreMyFave  · 技术社区  · 16 年前

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

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

    NullOrPropertyOf() 会回来的 null 无效的 startDateXAttribute 是 无效的 ),或返回 Func 如果它不是空的。

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

    3 回复  |  直到 16 年前
        1
  •  26
  •   Eric Lippert    11 年前

    这并没有简单的形式;实现一个是一个经常被请求的特性。语法可以是这样的:

    x = foo.?bar.?baz;
    

    也就是说,如果foo或食品酒吧为null,并且美食酒吧如果它们都不为空。

    我们考虑过它的C#4,但它没有使任何地方接近的优先名单。我们将记住这一点,以备将来可能的语言版本使用。

    更新:C#6将具有此功能。看到了吗 http://roslyn.codeplex.com/discussions/540883

        2
  •  1
  •   dtb    16 年前

    这个 XAttribute Class explicit conversion operator 为此:

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

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

    DateTime? result = (obj != null) ? (DateTime?)obj.DateTimeValue : null;
    
        3
  •  0
  •   nawfal Donny V.    12 年前

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

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