如何在c#中检查类是否为只读?

如何在c#中检查类是否为只读?,c#,.net,unit-testing,C#,.net,Unit Testing,我是否可以编写一个单元测试来确保我编写的只读类(一个没有setter的类)在将来保持只读?我不希望任何人在我的类中添加setter属性 基本上,我如何检查一个类是否在C#中没有设置器?注意:asker最初提出了一个问题“如何确定一个类是否是值类型?”后来对其进行了更改 或 MSDN:这应该是零: var setterCount = (from s in typeof(IDataCollector).GetProperties( BindingFlags.Public

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

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

注意:asker最初提出了一个问题“如何确定一个类是否是值类型?”后来对其进行了更改


MSDN:

这应该是零:

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

把所有字段都标为只读怎么样

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

通常,如果您想编写一个不可变的类,您应该将您的类标记为,并将所有字段标记为


当然,如果你希望人们从你的类继承,你必须考虑以下内容:

  • 没有任何东西可以阻止一个人通过向类中添加他们想要的任何属性来继承。除非按照约定,否则不能对继承者强制执行该约束

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

  • 你需要检查的不仅仅是你班上的二传手。一个人完全有可能编写一个方法,比如
    setSomething
    (一个Java风格的setter),或者编写具有改变内部值的副作用的方法。没有有效的方法来检查您的继承者是否没有使用类似的技巧来隐藏类中的可变性


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

我指的是值类型模式。。我想测试一个类是否没有setter。。。我不想知道它是一个结构还是其他特定于语言的值类型,比如int…当你说“hasnotsetters”时,你的意思是它的所有属性都没有setters吗?那么公共可写字段呢?我认为您要寻找的是一种通过没有可写属性或字段来确定类是否是不可变的方法。从你的问题中去掉那些价值类型的废话。这是误导性的。@theSoftwareJedi。。谢谢我猜海报关注的是派生类添加可变字段。因为他表达了对该类“在将来保持只读”的关注。在我看来,其他程序员可能“意外”使该类变为可变的最合理的场景是从该类派生并添加可变字段。
bool isValueType = typeof(YourClass).IsValueType
var setterCount =  
    (from s in typeof(IDataCollector).GetProperties(
        BindingFlags.Public | BindingFlags.Instance)
    where s.CanWrite == true
    select s)
    .Count();
    Type type = typeof(YourClass);
    PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance);
    bool passesTest = true;
    foreach (PropertyInfo property in properties)
    {
        passesTest = passesTest && property.CanWrite;
    }