检查对象实例是否为只读

5
如果我有一个对象实例,如何检查它是否为只读?
我已经搜寻了System.Type,有很多IsXxxx()和GetXxxx()类型的函数,但没有IsReadOnly(),IsWriteable(),GetReadWriteProperty()或类似的函数。我猜想像myObj.GetType().IsReadOnly()这样的东西会太容易了,而Object类本身除了GetType()之外没有任何有用的东西。
当我在谷歌上搜索这个问题时,我得到的都是使用readonly关键字的方法。
我考虑使用反射和GetProperty(),但这是一个存在于List<>中的基类,我认为我需要将这个对象实例作为另一个对象中的孤立属性才能这样做。
有什么建议吗?

1
你能提供一个你认为是只读的对象的例子吗?在对象级别上,没有定义这样的概念。字段可能是只读的,也可能不是只读的,属性可能具有公共设置,也可能没有,它可能被标记为[ImmutableObject(true)],但是...其中至少有两个实际上并不能使其不可变,第三个(字段)并不是强制性的或过于常见(因为字段将是私有的)。 - Marc Gravell
通过.GetType().GetProperties获取属性? - Marc Gravell
@MarcGravell: 我好像有点糊涂了。如果我执行 myObj.GetType().GetProperties,我将得到 myObj 内部的属性,而不是 myObj 本身的 CanRead/CanWrite。 - Nic Foster
是的,因为“CanRead/CanWrite”这样的对象并不存在。这个概念根本不存在。 - Marc Gravell
1
属性不是对象,它只是一些具有特定模式的方法的术语,即get_SomeProp和set_SomeProp。所以不,属性不是对象。在运行时,如果调用属性getter,它可能会返回某个对象,并且通过反射,您可以检查表示属性定义/声明的PropertyInfo(它是一个对象)。但是:仅此而已。CanWrite在这里实际上只是:“是否定义了set访问器”-但这与任何对象无关。 - Marc Gravell
显示剩余10条评论
3个回答

5

不存在所谓的“只读对象”这个概念。一个变量可以是只读的,但这是另一回事。例如:

class Foo
{
    private readonly StringBuilder readOnlyBuilder;
    private StringBuilder writableBuilder;

    public Foo()
    {
        readOnlyBuilder = new StringBuilder();
        writableBuilder = readOnlyBuilder;
    }
}

这里只有一个StringBuilder对象,但有两个字段 - 一个是只读的,另一个是可写的。

如果你问一个类型是否是不可变的(例如string是不可变的,StringBuilder不是),那就更加复杂了...有许多不同的不可变性种类。请参见Eric Lippert关于此问题的博客文章获取更多详细信息。


@Vijay Eric已经发布了他的意图进行调查 - 我认为这应该是相当明确的;另外 - 如果你要求别人查看某些东西(这有点强迫),至少要把它表述为一种恳求,而不是要求/命令。 - Marc Gravell
@Vijay:我不是微软员工,也不在C#团队中。但我已经发布了一个答案 - 我非常确定这是一个bug,并且有一种方法可以引发特别恶劣的行为。虽然我同意Marc的观点,“你需要关注”和“请保持可用性”更像是要求而不是真正需要的。 - Jon Skeet

4

2

Jon Skeet是正确的(当然),在C#中没有只读对象这一概念。但是,一些框架(例如WPF)有它们自己的只读对象概念。 WPF有freezables,可以在运行时使对象不可变,您可以通过IsFrozen检查freezable是否已冻结。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接