规定类中需要属性 - 编译时

时间:2009-02-16 20:11:56

标签: c# .net compiler-construction clr

是否有办法规定类的客户端应为类中的一组属性指定值。例如(见下面的代码),我是否可以规定Employment类中的“EmploymentType”属性应该在编译时指定?我知道我可以使用参数化构造函数等。我特意在编译期间输出自定义警告或错误。这可能吗?

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 个答案:

答案 0 :(得分:5)

正如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.");
}

如果你正在寻找抛出自定义编译器警告,这是不可能的。我在这里问了一个类似的问题Custom Compiler Warnings

答案 1 :(得分:4)

您可以通过不使用默认构造函数来实现您想要做的事情,而是定义一个将就业类型作为参数的构造函数。如果有人试图使用无参数构造函数实例化该类,则会出现编译错误。

编辑代码示例

  public Employment(EmploymentType eType)
    {
      this.EmploymentType = eType;
    }

答案 2 :(得分:3)

OO原则规定对象永远不应处于无效状态。所以这应该是一个构造函数参数。

无法指示在编译时需要属性。

答案 3 :(得分:3)

您在原始帖子中提到您已经知道使用构造函数执行此操作,这绝对是正确的方法。我不相信有任何方法可以做你想要的,即使是属性(通常是你如何操纵编译器警告等)。由于可以创建对象然后传递给另一个方法来设置参数,因此它不一定像“客户端必须指定值”那样明显。

您可以尝试创建自定义FxCop或VSTS静态分析规则,但我认为您不能仅使用C#编译器执行此操作。

答案 4 :(得分:0)

Interface Icontrol
 ' Declare an interface.
 Property MustHave() As String

End Interface

然后在您的用户控件中包含

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

它需要此属性