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

时间:2009-01-27 00:01:38

标签: c# .net unit-testing

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

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

5 个答案:

答案 0 :(得分:5)

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

bool isValueType = object.GetType().IsValueType

bool isValueType = typeof(YourClass).IsValueType

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

答案 1 :(得分:3)

这应该是零:

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

答案 2 :(得分:2)

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

通常,如果要编写不可变类,则应将类标记为sealed,并将所有字段标记为readonly


当然,如果您希望人们从您的班级继承,您必须考虑以下因素:

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

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

  • 您必须检查班级中的安装人员。它完全可以让一个人编写像setSomething(Java风格的setter)这样的方法,或编写带有改变内部值的副作用的方法。没有有效的方法可以检查你的继承人是否没有使用类似的技巧在你的课堂中偷偷摸摸。

如果允许人们继承你的班级,你真的没有办法让你的班级只读。

答案 3 :(得分:0)

    Type type = typeof(YourClass);
    PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance);
    bool passesTest = true;
    foreach (PropertyInfo property in properties)
    {
        passesTest = passesTest && property.CanWrite;
    }

答案 4 :(得分:0)

如何只标记所有字段 readonly