如何检查c#中的类是否只读?
我可以编写一个unit testing来确保我写的只读类(没有setter的类)将来仍然只读吗? 我不希望任何人在我的类中添加setter属性。
基本上,我如何检查一个类是否在C#中没有setter?
注意:提问者最初提出的问题是“我如何确定某个类是否为值类型?” 后来改了。
bool isValueType = object.GetType().IsValueType
要么
bool isValueType = typeof(YourClass).IsValueType
MSDN: http : //msdn.microsoft.com/en-us/library/system.type.isvaluetype.aspx
这应该是零:
var setterCount = (from s in typeof(IDataCollector).GetProperties( BindingFlags.Public | BindingFlags.Instance) where s.CanWrite == true select s) .Count();
我认为这里的关键词是“ 我不希望任何人在我的课程中添加一个setter属性。 ”
通常,如果要编写不可变类,则应将类标记为已密封,并将所有字段标记为只读 。
当然,如果您希望人们从您的class级inheritance,您必须考虑以下因素:
-
没有什么可以阻止一个人inheritance从他们想要的类中添加他们想要的任何属性。 除常规外,您不能对inheritance者强制执行该约束。
-
您可以使用reflection执行运行时检查以查看inheritance者是否添加了任何字段,但是我不推荐它,因为它违反了封装的一些基本原则。
-
您必须检查课程中的安装人员。 它完全可以让一个人编写像
setSomething
(Java风格的setter)这样的方法,或编写带有改变内部值的副作用的方法。 没有有效的方法来检查你的inheritance人是否没有使用类似的技巧来偷偷摸摸你的课程中的可变性。
如果允许人们inheritance你的class级,你真的没有办法让你的class级只读。
Type type = typeof(YourClass); PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance); bool passesTest = true; foreach (PropertyInfo property in properties) { passesTest = passesTest && property.CanWrite; }
如何只读标记所有字段?