2012-01-19 17 views
5

オブジェクトのインスタンスがある場合、それが読み取り専用かどうかをチェックするにはどうすればよいですか?オブジェクトのインスタンスが読み取り専用かどうかの確認

私はSystem.Typeを通過洗い上げときはIsXxxx()GetXxxx()機能の種類が、無IsReadOnly()、それらの線に沿ってIsWriteable()GetReadWriteProperty()、または何かのたくさんあります。私はmyObj.GetType().IsReadOnly()のようなものは簡単すぎると思いますし、Objectクラス自体にはGetType()以外のものは何もありません。

この質問をGoogleに送信すると、readonlyキーワードを使用する方法がすべて得られます。

ReflectionとGetProperty()を使用すると考えましたが、これはリスト<に存在する基本クラスです。このオブジェクトのインスタンスは別のオブジェクトの孤独なプロパティにする必要があります思う。

アイデア?

+0

は、私はよりよい次の時間を私の検索用語を絞り込む必要があると思う、私はこの質問をすることも信じています次の複製:http://stackoverflow.com/questions/481883/how-do-i-check-if-a-class-is-readonly-in-c –

+1

あなたが考えるオブジェクトの例を提供できますか?読み込み専用ですか?オブジェクトレベルでは、そのような概念は定義されていません。フィールドは読み込み専用であってもなくてもよく、プロパティには公開セットがある場合とそうでない場合があり、 '[ImmutableObject(true)]とマークされる場合とされない場合があります。実際にはそれを不変にする*、3番目のフィールドは必須ではない(フィールドがプライベートなので、フィールドは非公開になる) –

+0

@Marc Gravell:TypeのPropertyInfoはCanReadとCanWriteを与え、私は取得する方法を探していた任意のオブジェクト上のもの。 .GetType()による –

答えて

5

オブジェクトは読み取り専用ですという概念はありません。 変数は読み取り専用にすることはできますが、それは別の問題です。たとえば:

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

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

は、ここで一つだけStringBuilderオブジェクトがありますが、二つのフィールド - 1つの読み取り専用と1個の書き込み可能。

あなたはタイプが不変であるかどうかを求めている場合は、さまざまな種類不変のがあります...厄介質問だもの(例えばstringStringBuilderではない、不変です)。詳細は、Eric Lippert's blog post on the matterを参照してください。

+0

@Vijayエリックは、調査を行う意向を表明しています。また、人々に何かを見てもらうことを要求している場合(これは少し面倒です)、少なくとも要件/要求ではなく、賛成の言葉で表現してください。 –

+0

@Vijay:私はマイクロソフトの社員ではありません。どのような方法でもC#チーム。私は答えを投稿しました - 私はそれがバグだと確信しています、そして、特に厄介な振る舞いを引き起こす方法があります。私はMarcに同意しますが、 "あなたの注意が必要です"と "plsは自分自身を利用可能にしています"というのは、実際に求められているよりもむしろ要求です。 –

2

Jon Skeetは正しいです(もちろん)、C#では読み取り専用オブジェクトはありません。ただし、WPFなどの一部のフレームワークでは、読み取り専用オブジェクトという独自の概念があります。 WPFにはfreezablesというオブジェクトがあり、実行時に不変にすることができるオブジェクトは、IsFrozenでフリーズ可能かどうかを確認できます。

3

あなたは読み取り専用フィールドをチェックしたい場合は、の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; 
関連する問題