【问题标题】:How do I check if a class is readonly in c#?如何检查一个类是否在 C# 中是只读的?
【发布时间】:2009-01-27 00:01:37
【问题描述】:

我是否可以编写一个单元测试来确保我编写的只读类(没有设置器的类)在未来仍然是只读的?我不希望任何人在我的类中添加 setter 属性。

基本上,我如何检查一个类是否在 C# 中没有设置器?

【问题讨论】:

  • 当你说“没有设置器”时,你的意思是它上面的所有属性都没有设置器吗?公共可写字段呢?
  • 我认为您正在寻找的是一种通过没有可写属性或字段来确定您的类是否为 IMMUTABLE 的方法。从您的问题中删除所有值类型的废话。这是误导。
  • @theSoftwareJedi .. 谢谢

标签: c# .net unit-testing


【解决方案1】:

注意:提问者最初提出的问题是“我如何确定一个类是否为值类型?”后来改了。

bool isValueType = object.GetType().IsValueType

bool isValueType = typeof(YourClass).IsValueType

MSDN:http://msdn.microsoft.com/en-us/library/system.type.isvaluetype.aspx

【讨论】:

  • 我指的是值类型模式。我想测试一个类是否没有设置器...我不想知道它是结构还是其他语言特定的值类型,例如 int ...
【解决方案2】:

这应该是零:

var setterCount =  
    (from s in typeof(IDataCollector).GetProperties(
        BindingFlags.Public | BindingFlags.Instance)
    where s.CanWrite == true
    select s)
    .Count();

【讨论】:

    【解决方案3】:

    我认为这里的关键词是“我不希望任何人在我的类中添加 setter 属性。

    一般来说,如果你想写一个不可变的类,你应该将你的类标记为sealed,并将所有字段标记为readonly


    当然,如果您希望人们从您的类继承,您必须考虑以下几点:

    • 没有什么可以阻止一个人继承添加他们想要的任何属性到你的类。除非按照惯例,否则您不能对继承者强制执行该约束。

    • 可以使用反射进行运行时检查,以查看继承者是否添加了任何字段,但我不建议这样做,因为它违反了封装的一些基本原则。

    • 您不仅要检查班级中的二传手。一个人完全可以编写像setSomething(Java 风格的setter)这样的方法,或者编写具有改变内部值的副作用的方法。没有有效的方法来检查您的继承者是否没有使用类似的技巧在您的类中偷偷改变。

    如果你允许人们继承你的类,你真的无法让你的类保持只读状态。

    【讨论】:

      【解决方案4】:
          Type type = typeof(YourClass);
          PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance);
          bool passesTest = true;
          foreach (PropertyInfo property in properties)
          {
              passesTest = passesTest && property.CanWrite;
          }
      

      【讨论】:

        【解决方案5】:

        只标记所有字段如何只读

        【讨论】:

        • 我认为发帖者担心派生类添加可变字段。
        • 因为他表达了他对“未来仍为只读”类的担忧。在我看来,其他一些程序员可能“意外”使类可变的最合理的场景是从它派生并添加可变字段。
        猜你喜欢
        • 1970-01-01
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 2023-01-13
        • 2010-11-16
        相关资源
        最近更新 更多