2010-11-03 18 views
6

En este momento, sin necesidad de utilizar las propiedades, lo he entendido:Adición de atributos a C# Propiedad conjunto de parámetros

public void SetNumber([Array(new int[]{8})] Byte[] number) 

Como se puede ver, estoy añadiendo el atributo ArrayAttribute al parámetro.

Lo que quiero hacer es lo mismo pero en un setter de propiedades. Esto no funciona:

[Array(new int[]{8})] 
public Byte[] SetNumber 
{ 
    set 
    { 
    } 
    get 
    { 
    return null; 
    } 
} 

¿Hay alguna manera de unir el atributo al parámetro set_SetNumbervalue método?

Además, una pregunta relacionada. Los dos métodos generados (el get/set) no tienen el atributo personalizado. ¿Alguien puede explicarme por qué es eso?

Respuesta

7

Es necesario utilizar el paramattribute target en el set:

public Byte[] SetNumber { 
    [param: Array(new int[] { 8 })] 
    set { 
    } 
    get { 
    return null; 
    } 
} 

En cuanto a la segunda cuestión, el atributo personalizado se establece en el propiedad en sí misma, no en los métodos de acceso a la propiedad.

Además, si su ArrayAttribute sólo alguna vez se aplica a los parámetros, podría definirse así:

[AttributeUsage(AttributeTargets.Parameter)] 
public class ArrayAttribute : Attribute { 
    // ... 
} 
+2

+1 nunca lo supo. – SLaks

+0

Gracias, esto resolvió mi problema. – tlg

0

No lo haga, cree un método tal como lo hizo en el primer ejemplo. No puedes pasar nada más que valor al conjunto.

public Byte[] TheNumber 
{ 
    private set; 
    get 
    { 
     return null; 
    } 
} 

public void SetNumber([Array(new int[] { 8 })] Byte[] number) 
{ 
    this.TheNumber = number; 
} 
+0

Por cierto, si usted tiene una propiedad expuesta como la de arriba, puede utilizar conjunto privado; – CrazyDart

+0

echa un vistazo a este enlace http://oreilly.com/catalog/progcsharp/chapter/ch18.html – CrazyDart

+0

En realidad, eso podría funcionar. Solo un poco de nota de fondo, estoy generando estos métodos a partir de un archivo XML. El atributo es para que la prueba unitaria genere una matriz de longitud adecuada como parámetro. – tlg

0

No estoy seguro, pero mi conjetura es que no se puede hacer lo que quiere - el parámetro colocador value no está expuesta para que aplique un atributo a.

Y en cuanto a su segunda pregunta, una propiedad es distinta de su getter & métodos setter. Se puede aplicar un atributo al método de selección de este modo:

public Byte[] SetNumber 
{ 
    [Array(new int[]{8})] 
    set 
    { 
    } 
    get 
    { 
    return null; 
    } 
} 
+0

Lo intenté, pero sigo obteniendo nulos cuando intento invocar GetCustomAttribute (true) en la versión del método de configuración de la propiedad (en la ventana Inmediato de depuración). De todos modos, creo que voy a renunciar a la idea por ahora. Gracias. – tlg

Cuestiones relacionadas