2014-01-02 5 views
0

У меня есть следующий класс, который изменяет результат некоторого запроса:взаимозависимые свойства в пределах класса

public class UniversalPrincipalQueryOptions 
{ 
    public Boolean IncludeProperties { get; set; } 
    public Boolean IncludeOrganizationUnits { get; set; } 
    public Boolean IncludeManagers { get; set; } 

    public static UniversalPrincipalQueryOptions All 
    { 
     get 
     { 
      return new UniversalPrincipalQueryOptions { IncludeOrganizationUnits = true, IncludeProperties = true, IncludeManagers = true }; 
     } 
    } 

    public static UniversalPrincipalQueryOptions None 
    { 
     get 
     { 
      return new UniversalPrincipalQueryOptions { IncludeProperties = false }; 
     } 
    } 

    public UniversalPrincipalQueryOptions() 
    { 
     this.IncludeProperties = true; 
    } 
} 

Дело в том, установив IncludeOrganizationUnits в true когда IncludeProperties является false не имеет смысла в моем случае и то же идет за IncludeManagers, который также зависит от IncludeOrganizationUnits, установленного на true.

Я не думаю, что это лучший способ сделать это. Итак, мой вопрос: какой шаблон я могу использовать для улучшения этого класса и облегчить для других использование моего класса?

UPDATE:

Ok, так что я в конечном итоге переход на enum украшенного Flags атрибута:

[Flags] 
public enum UniversalPrincipalQueryOptions 
{ 
    None = 0, 
    IncludeProperties = 1, 
    IncludeOrganizationUnits = 2 | IncludeProperties, 
    IncludeManagers = 4 | IncludeOrganizationUnits 
} 
+0

«true-ish» имеет смысл в javascript (обычно называемый правдивым), но что означает true-ish для aC# boolean? – Jamiec

+0

В чем вопрос? – ken2k

+0

Не ответ: Но подобное принудительное использование правил является обычным примером, используемым в примерах библиотеки [CodeContract] (http://research.microsoft.com/en-us/projects/contracts/). – Jamiec

ответ

2

Простой ответ для проверки значений вместо чистых авто свойств:

public Boolean IncludeProperties { get; set; } 

private Boolean includeOrganizationUnits; 
public Boolean IncludeOrganizationUnits 
{ 
    get { return this.includeOrganizationUnits } 
    set 
    { 
     if(value && !IncludeProperties) 
      throw new InvalidOperationException("IncludeProperties must be true when IncludeOrganizationUnits is set to true"); 
     includeOrganizationUnits = value; 
    } 
} 

Этот вид предварительного условия также может быть сконфигурирован с использованием CodeContracts однако имейте в виду, что есть performance hit by doing so.

Другой вариант, если потребители не на самом деле нужно, чтобы установить эти булевы сам себе является расширить свой список статических, чтобы охватить все (действительные) возможности и сделать вещи частные (как сеттеры и CTOR):

public class UniversalPrincipalQueryOptions 
{ 
    public Boolean IncludeProperties { get; private set; } 
    public Boolean IncludeOrganizationUnits { get; private set; } 
    public Boolean IncludeManagers { get; private set; } 

    // UPDATED !! 
    public static UniversalPrincipalQueryOptions OrganizationUnitsAndManagers 
    { 
     get 
     { 
      return new UniversalPrincipalQueryOptions { IncludeOrganizationUnits = true, IncludeProperties = true, IncludeManagers = true }; 
     } 
    } 

    // NEW!! 
    public static UniversalPrincipalQueryOptions OrganizationUnits 
    { 
     get 
     { 
      return new UniversalPrincipalQueryOptions { IncludeOrganizationUnits = true, IncludeProperties = true}; 
     } 
    } 

    public static UniversalPrincipalQueryOptions None 
    { 
     get 
     { 
      return new UniversalPrincipalQueryOptions { IncludeProperties = false }; 
     } 
    } 

    private UniversalPrincipalQueryOptions() 
    { 
     this.IncludeProperties = true; 
    } 
} 
+0

Если пользователю не требуется устанавливать значение свойств, то это может быть частный конструктор. – ken2k

+0

@ ken2k - вы имеете в виду, как частный конструктор, который я надел на класс? – Jamiec

+0

Да, точно (но мы все еще не уверены, что это вариант использования OP) – ken2k

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