【问题标题】:How to force the compiler to check if a specific property is set如何强制编译器检查是否设置了特定属性
【发布时间】:2012-09-20 00:08:26
【问题描述】:

在下面的类中,我想强制编译器检查PropC是否设置,如果没有,在编译模式下显示错误。

public class ClassA 
{
    public object PropA { get; set; }
    public object PropB { get; set; }
    public object PropC { get; set; }        
}

我知道我可以使用 PostShart 创建自定义属性,但我想使用 .NET 内置类。

【问题讨论】:

  • PropC 直到运行时才设置。你不能抛出这样的编译时错误。你到底想要什么?
  • Peyman,请检查我的标题编辑是否与您要查找的内容一致。
  • 我想确保所有启动ClassA的类,都必须设置PropC
  • 也许您想要隐藏默认构造函数,而是使用需要为PropC 传递值的构造函数。
  • @Kendall Frey:由于某种原因,我不能使用带参数的构造函数,这就是寻找属性的原因

标签: c# .net


【解决方案1】:

这不是 .NET 框架的默认功能。

但是,您可以使用Code Contracts package to ensure Object Invariants

您可以配置设置以在您的类上运行Static Code Analysis,以确保满足可验证的不变量。作为回退,您将获得这些合约的运行时安全性,因为访问具有无效返回值的属性将导致运行时错误或调试断言。这是通过 Code Contract 包在编译期间重写您的代码并插入额外的代码来验证您的合约来实现的。

请注意,这些行为都取决于您配置的设置。该软件包太复杂,无法在 stackoverflow 答案中解释,但您可以在 http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf 阅读手册/文档。

【讨论】:

    【解决方案2】:

    您所要求的仅在运行时可用,而不是在编译时可用。您应该使用单元测试来检查是否正在设置属性。

    【讨论】:

      【解决方案3】:

      我虽然检查你的程序will finish 是否类似,但我认为你想要更多范围的版本:“如果我的对象创建确保在对象离开它创建的函数之前设置属性”。这在理论上是可能的,但 C# 编译器没有提供这样做的方法。我相信在编译时根本不可能进行更广泛的检查“是否在使用前分配了属性”。

      重构可能是更好的方法 - 如果您根本不允许创建无效对象,那么证明此类对象不存在于程序中会容易得多。 IE。 factory method pattern也许是一种选择:

      public class ClassA 
      {
         public object PropC { get; private set; }        
         private ClassA (){};
         public Create (object propC)
         {
            return new ClassA{ PropC = propC };
         }
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-27
        • 2011-11-03
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多