Подчеркивая, что свойство требуется в классе - время компиляции - PullRequest
2 голосов
/ 16 февраля 2009

Есть ли способ оговорить, что клиенты класса должны указывать значение для набора свойств в классе. Например (см. Код ниже), могу ли я указать, что свойство "EmploymentType" в классе Employment должно быть указано во время компиляции? Я знаю, что могу использовать параметризованный конструктор и тому подобное. Я специально ищу вывод пользовательского предупреждения или ошибки во время компиляции. Это возможно?

public class Employment
{
   public EmploymentType EmploymentType {get; set;}
}

public enum EmploymentType
{
    FullTime = 1,
    PartTime= 2
}

public class Client
{
    Employment e = new Employment();
// if i build the above code, i should get a error or warning saying you should specify value for EmploymentType
}

Ответы [ 5 ]

5 голосов
/ 16 февраля 2009

Как сказал cmsjr, вам нужно сделать следующее:

public class Employment
{
    public Employment(EmploymentType employmentType)
    {
        this.EmploymentType = employmentType;
    }

    public EmploymentType EmploymentType { get; set; }
}

Это заставит абонентов передавать значение при создании следующим образом:

Employment e = new Employment(EmploymentType.FullTime);

В ситуации, когда вам нужен конструктор по умолчанию (например, сериализация), но вы все еще хотите применить правило, вам потребуется некоторая проверка состояния. Например, каждый раз, когда вы пытаетесь выполнить операцию с классом Employment, вы можете проверить его на наличие действительного состояния, такого как:

public EmploymentType? EmploymentType { get; set; } // Nullable Type

public void PerformAction()
{
    if(this.Validate())
        // Perform action
}
protected bool Validate()
{
    if(!EmploymentType.HasValue)
        throw new InvalidOperationException("EmploymentType must be set.");
}

Если вы ищите предупреждения о создании собственного компилятора, это не совсем возможно. Я задал похожий вопрос здесь Настраиваемые предупреждения компилятора

4 голосов
/ 16 февраля 2009

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

РЕДАКТИРОВАТЬ образец кода

  public Employment(EmploymentType eType)
    {
      this.EmploymentType = eType;
    }
3 голосов
/ 16 февраля 2009

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

Вы можете попытаться создать собственное правило статического анализа FxCop или VSTS, но я не думаю, что вы сможете сделать это только с помощью компилятора C #.

3 голосов
/ 16 февраля 2009

Принципы ОО предписывают, что объект никогда не должен находиться в недопустимом состоянии. Так что это должен быть параметр конструктора.

Нет способа указать, что свойство требуется во время компиляции.

0 голосов
/ 08 ноября 2012
Interface Icontrol
 ' Declare an interface.
 Property MustHave() As String

End Interface

Тогда в вашем пользовательском контроле включите

 Public Class mycontrol
 Inherits System.Web.UI.UserControl
 Implements Icontrol

Это делает это свойство обязательным

...