2012-01-19 11 views
5

Si tengo una instancia de un objeto, ¿cómo puedo verificar si es o no de solo lectura?Comprobando si una instancia de un objeto es de solo lectura

He rastreado a través System.Type y que son un montón de IsXxxx() y GetXxxx() tipos de funciones, pero sin IsReadOnly(), IsWriteable(), GetReadWriteProperty(), o algo por el estilo. Supongo que algo como myObj.GetType().IsReadOnly() hubiera sido demasiado fácil, y la clase Object en sí misma no tiene nada útil aparte de GetType().

Cuando googleo esta pregunta, todo lo que obtengo son formas de utilizar la palabra clave readonly.

I pensado en utilizar Reflexión y GetProperty() pero esto es una clase base que existe en una lista <>, necesitaría la instancia de este objeto a ser una propiedad solitario en otro objeto para mí hacer esto lo haría pensar.

¿Alguna idea?

+0

parece que necesito para refinar mis términos de búsqueda mejor la próxima vez, creo que esta pregunta puede ser un duplicado de: http://stackoverflow.com/questions/481883/how-do-i-check-if-a-class-is-readonly-in-c –

+1

Puede proporcionar un ejemplo de un objeto que considere ser solo? En el nivel de objeto, no se define tal concepto. Los campos pueden o no ser de solo lectura, y las propiedades pueden tener o no conjuntos públicos, y pueden o no estar marcados como '[ImmutableObject (true)]' - pero ... al menos 2 de esos * no en realidad lo hace inmutable *, y el tercero (los campos) no es obligatorio o demasiado común (ya que los campos serían privados) –

+0

@Marc Gravell: PropertyInfo para un tipo da un CanRead y CanWrite, estaba buscando una manera de obtener aquellos en cualquier objeto dado. –

Respuesta

5

No hay ningún concepto como objeto que sea de solo lectura. Una variable puede ser de solo lectura, pero esa es una cuestión diferente. Por ejemplo:

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

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

Aquí sólo hay una StringBuilder objeto, pero dos campos - uno de sólo lectura y una escritura.

si estás preguntando si un tipo es inmutable (por ejemplo string es inmutable, no es StringBuilder) que es una cuestión más espinosa ... hay muchos tipos diferentes de la inmutabilidad. Ver Eric Lippert's blog post on the matter para más detalles.

+0

@Vijay Eric ha publicado, con sus intenciones de investigar, creo que debería ser bastante definitivo; también, si le pide a la gente que mire algo (que es un poco una imposición), al menos formúlelo como un favor en lugar de un requisito/demanda –

+0

@Vijay: no soy un empleado de Microsoft, o en el C# equipo de ninguna manera. Aunque publiqué una respuesta: estoy bastante seguro de que * es * un error, y hay una manera de provocar un comportamiento particularmente desagradable. Sin embargo, estoy de acuerdo con Marc, "tu atención es necesaria" y "por favor ponte a tu disposición" son más bien demandas que lo que realmente se necesita. –

2

Jon Skeet tiene razón (por supuesto), no existe el objeto de solo lectura en C#. Sin embargo, algunos frameworks, como WPF, tienen su propio concepto de objetos de solo lectura. WPF tiene freezables, objetos que se pueden hacer inmutables en tiempo de ejecución, puede verificar si un freezable está congelado a través del IsFrozen.

3

Si desea comprobar campos sólo lectura, puede utilizar la propiedad IsInitOnly en la clase 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; 
Cuestiones relacionadas