Проверка, доступен ли экземпляр объекта только для чтения - PullRequest
5 голосов
/ 19 января 2012

Если у меня есть экземпляр объекта, как я могу проверить, доступен ли он только для чтения?

Я просмотрел System.Type, и это множество типов функций IsXxxx() и GetXxxx(), но не IsReadOnly(), IsWriteable(), GetReadWriteProperty() или что-то в этом роде. Я думаю, что-то вроде myObj.GetType().IsReadOnly() было бы слишком легко, и сам класс Object не имеет ничего полезного, кроме GetType ().

Когда я задаю этот вопрос в Google, все, что я получаю, это способы использования ключевого слова readonly.

Я думал об использовании Reflection и GetProperty (), но это базовый класс, который существует в List <>, мне нужно, чтобы экземпляр этого объекта был одиноким свойством в другом объекте, чтобы я мог сделать это, я думаю, .

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 19 января 2012

Нет такого понятия, как объект , доступный только для чтения. переменная может быть доступна только для чтения, но это другой вопрос. Например:

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

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

Здесь есть только один StringBuilder объект, но два поля - одно только для чтения и одно для записи.

Если вы спрашиваете, является ли тип неизменным (например, string неизменен, StringBuilder нет), это сложный вопрос ... есть много различных видов неизменности. См. сообщение Эрика Липперта в блоге по этому вопросу для получения более подробной информации.

4 голосов
/ 19 января 2012

Если вы хотите проверить наличие полей ReadOnly, используйте свойство IsInitOnly класса FieldInfo

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 голосов
/ 19 января 2012

Джон Скит прав (конечно), в C # нет такого понятия, как объект только для чтения.Однако некоторые фреймворки, такие как WPF, имеют собственную концепцию объектов только для чтения.WPF имеет freezables , объекты, которые можно сделать неизменяемыми во время выполнения, вы можете проверить, заморожен ли freezable через IsFrozen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...