检查Object的实例是否为只读

时间:2012-01-19 06:28:35

标签: c# c#-4.0 object reflection readonly

如果我有一个Object实例,我该如何检查它是否为只读?

我通过System.Type搜索了很多IsXxxx()GetXxxx()类型的函数,但没有IsReadOnly()IsWriteable()GetReadWriteProperty(),或者沿着那条线的任何东西我想像myObj.GetType().IsReadOnly()这样的东西太容易了,除了GetType()之外,Object类本身没有任何用处。

当我谷歌这个问题时,我得到的是使用readonly关键字的方法。

我想过使用Reflection和GetProperty()但是这是一个存在于List<>中的基类,我需要这个对象的实例作为另一个对象中的一个单独的属性让我这样做我会认为

有什么想法吗?

3 个答案:

答案 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)

Jon Skeet是对的(当然),在C#中没有只读对象这样的东西。但是,某些框架(如WPF)有自己的只读对象概念。 WPF有freezables个可以在运行时变为不可变的对象,你可以通过IsFrozen来检查冻结是否被冻结。