2010-11-03 19 views
6

In questo momento, senza l'utilizzo di proprietà, ho questo:aggiunta di attributi a C# Proprietà set di parametri

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

Come potete vedere, sto aggiungendo l'attributo ArrayAttribute al parametro.

Quello che voglio fare è lo stesso, ma su un setter di proprietà. Questo non funziona:

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

C'è un modo di associare l'attributo al parametro set_SetNumbervalue metodo?

Inoltre, una domanda correlata. I due metodi generati (get/set) non hanno l'attributo personalizzato. Qualcuno può spiegarmi perché è così?

risposta

7

è necessario utilizzare il paramattribute target sul set:

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

Per quanto riguarda la seconda domanda, l'attributo personalizzato è impostato sulla proprietà stessa, non sui metodi di accesso della proprietà.

Inoltre, se il ArrayAttribute vale sempre e solo ai parametri, si potrebbe definire in questo modo:

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

+1 non lo sapevo mai. – SLaks

+0

Grazie, questo ha risolto il mio problema. – tlg

0

Non lo fai, crea un metodo come hai fatto nel primo esempio. Non puoi passare nulla di diverso dal valore per il set.

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

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

A proposito, se si dispone di una proprietà esposta come sopra, è possibile utilizzare insieme privato; – CrazyDart

+0

consulta questo link http://oreilly.com/catalog/progcsharp/chapter/ch18.html – CrazyDart

+0

In realtà, potrebbe funzionare. Solo un po 'di nota di fondo, sto generando questi metodi da un file XML. L'attributo è per il test unitario per generare un array di lunghezza appropriato come parametro. – tlg

0

Io non sono certo, ma la mia ipotesi è che non si può fare ciò che si vuole - il parametro setter value non è esposto per di applicare un attributo.

E per quanto riguarda la seconda domanda, una proprietà è distinta dai suoi metodi di settaggio getter &. È possibile applicare un attributo al metodo setter in questo modo:

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

Ho provato, ma ottengo ancora null quando provo a richiamare GetCustomAttribute (true) sulla versione del metodo set della proprietà (nella finestra Debug Immediate). Comunque penso che abbandonerò l'idea per ora. Grazie. – tlg

Problemi correlati