Какая терминология для чего этот метод пытается? - PullRequest
3 голосов
/ 03 февраля 2012

Я не знаю:

  1. если это работает.
  2. если это хорошая идея.
  3. как это называется по порядку чтобы узнать больше об этом.

Но я думаю, что намерение довольно очевидно.

public static class DebugLogic
{
    public static bool ThrowIfNull = false;

    public static T OrNew<T>(this T obj) where T : class
    {
        if (obj != null) return obj;
        else if (ThrowIfNull) throw new ArgumentNullException(//to do...);
        else return Activator.CreateInstance<T>();

    }
}

Использование по назначению: var customer = order.Sale.OrNew().Customer.OrNew().Name

Что я делаю? Это безумно или полезно? Это кажется полезным.

Ответы [ 2 ]

6 голосов
/ 03 февраля 2012

Я думаю, что идея иметь метод OrNew в порядке. Особенно, если вы стремитесь сделать свободный интерфейс. Однако я бы изменил 3 вещи об этом

  1. Нет скрытого флага, который контролирует поведение (ThrowIfNull). Это делает невозможным, чтобы кто-то прочитал OrNew вызов и понял, что он делает.
  2. Используйте ограничение new в пользу менее безопасного Activator.CreateInstance<T>() вызова
  3. Я бы назвал это чем-то отличным от DebugLogic. Обычно (но не всегда) контейнеры метода расширения заканчиваются на Extensions.

Например

public static class LogicExtensions {
  public static T OrNew<T>(this T obj) where T : class, new() {
    if (obj != null) {
      return obj;
    }
    return new T();
  }
}
0 голосов
/ 03 февраля 2012

Название этой операции ясно: DefaultIfNull

...