2012-01-19 44 views
5

如果我有一個對象的實例,如何檢查它是否只讀?檢查對象的實例是否爲只讀

我已經通過System.Type的沖刷和大量的IsXxxx()GetXxxx()類型的功能,但沒有IsReadOnly()IsWriteable()GetReadWriteProperty(),或沿着這些線路的東西。我猜像myObj.GetType().IsReadOnly()會太容易了,除了GetType()之外,Object類本身沒有任何用處。

當我谷歌這個問題我得到的所有是使用readonly關鍵字的方法。我想使用反射和GetProperty(),但這是一個存在於列表中的基類<>,我需要這個對象的實例是另一個對象中的唯一屬性,對我來說這樣做我會認爲。

任何想法?

+0

想我下一步需要時間來改進搜索條件更好,我相信這個問題可能是一個副本:http://stackoverflow.com/questions/481883/how-do-i-check-if-a-class-is-readonly-in-c –

+1

你能提供一個你認爲的對象的例子嗎?只讀嗎?在目標層面上,沒有定義這樣的概念。這些字段可能是也可能不是隻讀的,並且這些屬性可能有也可能沒有公共集合,並且它可能被標記爲「[ImmutableObject(true)]」 - 但是......至少有兩個*不會實際上它是不可變的*,第三個(字段)不是強制的或過於通用的(因爲這些字段將是私有的) –

+0

@Marc Gravell:PropertyInfo for一個類型給出了一個CanRead和CanWrite,我正在尋找一種方法來獲取那些在任何給定的對象。 –

回答

5

沒有這樣的概念,對象是隻讀的。 A 變量可以是隻讀的,但這是另一回事。例如:

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

+0

@Vijay Eric發佈了他的意圖進行調查 - 我認爲這應該是相當明確的;另外 - 如果你要求人們看一些東西(這是一種強制),至少將它作爲一種優惠而不是一種要求/需求來形容 –

+0

@Vijay:我不是微軟的員工,也不是C#團隊以任何方式。儘管我已經發布了一個答案 - 我很確定它*是一個錯誤,並且有一種挑釁特別惡劣行爲的方式。我同意馬克的觀點,「你需要注意」和「請讓自己可用」更像是真正需要的要求。 –

2

Jon Skeet是對的(當然),在C#中不存在只讀對象。但是,某些框架(如WPF)具有其自己的只讀對象概念。 WPF有freezables,這些對象可以在運行時變得不可變,你可以通過IsFrozen來檢查一個凍結文件是否被凍結。