如果我有一个Object实例,我该如何检查它是否为只读?
我通过System.Type搜索了很多IsXxxx()
和GetXxxx()
类型的函数,但没有IsReadOnly()
,IsWriteable()
,GetReadWriteProperty()
,或者沿着那条线的任何东西我想像myObj.GetType().IsReadOnly()
这样的东西太容易了,除了GetType()之外,Object类本身没有任何用处。
当我谷歌这个问题时,我得到的是使用readonly关键字的方法。
我想过使用Reflection和GetProperty()但是这是一个存在于List<>中的基类,我需要这个对象的实例作为另一个对象中的一个单独的属性让我这样做我会认为
有什么想法吗?
答案 0 :(得分:5)
没有像对象这样的概念是只读的。 变量可以是只读的,但这是另一回事。例如:
class Foo
{
private readonly StringBuilder readOnlyBuilder;
private StringBuilder writableBuilder;
public Foo()
{
readOnlyBuilder = new StringBuilder();
writableBuilder = readOnlyBuilder;
}
}
这里只有一个StringBuilder
对象,但有两个字段 - 一个是只读的,一个是可写的。
如果您在询问类型是否是不可变的(例如string
是不可变的,StringBuilder
不是),这是一个棘手的问题...有许多不同的种的不变性。有关详细信息,请参阅Eric Lippert's blog post on the matter。
答案 1 :(得分:4)
如果要检查ReadOnly字段,请使用FieldInfo类上的IsInitOnly
属性
http://msdn.microsoft.com/en-us/library/system.reflection.fieldinfo.isinitonly.aspx
//Get the Type and FieldInfo.
Type myType = typeof(myReadOnlyfield);
FieldInfo myFieldInfo = myType.GetField("ReadOnlyfield",
BindingFlags.Public | BindingFlags.Instance);
//Check if the field is read only
bool readOnly = myFieldInfo.IsInitOnly;
答案 2 :(得分:2)
IsFrozen
来检查冻结是否被冻结。