2010-09-29 3 views
6

Я пытаюсь написать универсальный метод расширения, которые позволяют это мне сделать это:Ярлыка для «нулевого значения, если объект является недействительным или object.member, если объект не является нулевым»

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

NullOrPropertyOf() вернется null если он используется на объекте null (например, если startDateXAttribute был null) или вернуть результат Func, если он не является нулевым.

Как выглядит этот метод расширения?

+0

И это одна: http://stackoverflow.com/questions/336775/pipe-forwards-in-c/337846#337846 –

+0

... и это одна: http://stackoverflow.com/questions/854591/how-to-check-for-nulls-in-the-deep-lambda-expression/854619 # 854619 –

+3

Примечание для разработчиков языка C#: добавление чего-то типа нуль-безопасного оператора разыменования к языку, вероятно, будет популярный особенность. :-) –

ответ

24

Там нет короткой формы для этого; реализация одной из них является довольно часто запрашиваемой функцией. Синтаксис может быть что-то вроде:

x = foo.?bar.?baz; 

То есть, х равно нулю, если Foo или foo.bar равны нулю, и результат foo.bar.baz, если ни один из них не равны нулю.

Мы рассмотрели его для C# 4, но он не сделал его нигде в верхней части списка приоритетов. Мы будем иметь в виду гипотетические будущие версии языка.

ОБНОВЛЕНИЕ: C# 6 будет иметь эту функцию. См. http://roslyn.codeplex.com/discussions/540883 для обсуждения конструктивных соображений.

+3

гипотетический? Надеюсь, MS не собирается скоро бросать C#;) –

+15

@vc: Я напоминаю вам все, что размышления Эрика о гипотетических функциях необъявленных будущих продуктов, которые не существуют сегодня и могут никогда не существовать, являются * только для развлекательных целей * и не представляют собой любое обещание предоставить любой продукт с любой функцией в любое время. –

+4

Ты мое определение для осторожного –

1

XAttribute Class обеспечивает explicit conversion operator для этого:

XAttribute startDateXAttribute = // ... 

DateTime? result = (DateTime?)startDateXAttribute; 

В общем случае, лучший вариант, вероятно, это:

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

Вы хотите что-то ищите? Я думаю, что это ломается, если вы передаете тип значения, который не является нулевым, но он должен работать, когда вы используете типы с нулевым значением. Пожалуйста, дайте мне знать, если есть что-то, что я упустил.

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

Вам не нужно указывать тип параметра лямбда после записи типа на lhs. – nawfal

Смежные вопросы