2015-12-27 14 views
9

Non penso sia possibile ma poiché non ho una chiarezza definita da MSDN, ritengo che sia meglio chiedere. Supponiamo di avere una classe come segue.È possibile aggiungere un attributo a una proprietà in una classe parziale?

public partial class Hazaa 
{ 
    public int Shazoo { get; set; } 
} 

Poi, mi piacerebbe Shazoo da attribuire come SuperCoolma voglio farlo in un altro file. Poiché utilizzo classi parziali, posso aggiungere alle nuove proprietà come segue.

public partial class Hazaa 
{ 
    [SuperCool] 
    public int Wheee { get; set; } 
} 

Ma posso attribuire una proprietà dichiarata nel primo campione scrivendo il codice in quest'ultimo? Dubito che sia possibile, ma sarò lieto di essere corretto. Se sì, qual è la sintassi?

risposta

4

No, non è possibile.

È possibile solo attribuire attributi ai membri che si dichiarano lì e quindi, e a meno che il membro sia anche dichiarato come parziale (in modo da poterlo reimplementare altrove) non è possibile allegare attributi ai membri dichiarati in un altro file parziale.

+0

(1) Darn ... (2) Membro parziale **? Come hai sicuramente capito, la prima parte è autogenerata. Posso forzarlo a essere parziale dal file di cui sono in controllo ** senza che sia stata modificata l'autogenerazione? (3) +1 per brevità. –

+0

Dubbi, ci sono requisiti di sintassi speciali per l'implementazione di un membro parziale, come dover specificare la parola chiave 'partial' e nessun modificatore di accesso. –

13

In base alle vostre esigenze, come opzione è possibile considerare l'utilizzo di:

Gli attributi che è possibile registrare in questo modo non sono in realtà attribuisce la classe, ma la maggior parte dei quadri usare come gli attributi nativi della tua classe.

Se si desidera aggiungere attributi di annotazioni di dati, in particolare nel progetto ASP.NET MVC, questo strumento sarà utile.

Anche per altri framework come Windows Forms che non supportano MetadataTypeAttribute è possibile aggiungere semplicemente il supporto utilizzando AssociatedMetadataTypeTypeDescriptionProvider.

La soluzione non è limitata agli attributi delle annotazioni di dati ed è possibile utilizzare tutti i tipi di attributi significativi per le proprie librerie e framework.

Come definire attributi aggiuntivi?

È possibile creare una classe di metadati che contiene proprietà della classe originale decorate con attributi appropriati e quindi decorare la classe parziale mediante l'attributo MetadataType e introdurre la classe di metadati per la classe originale.

Come visualizzare l'impatto di tali attributi?

I quadri come ASP.NET MVC utilizzano quegli attributi come sono definiti nella classe originale.

Inoltre, è possibile registrare AssociatedMetadataTypeTypeDescriptionProvider come provider per il tipo originale per altri framework o componenti che potrebbero voler utilizzare TypeDescriptor per ottenere informazioni sul tipo.

Sono davvero i miei attributi di classe?

Si prega di prestare attenzione, in questo modo, gli attributi in realtà non appartengono alla classe originale, ma per la maggior parte dei quadri, come ASP.NET MVC o Windows Forms che utilizzano TypeDescriptor per ottenere informazioni sui tipi, si comportano come la classe attributi originali.

Quindi, se si desidera ottenere attributi per una proprietà utilizzando la riflessione, non è possibile vederli, ma se si utilizza il meccanismo TypeDescriptor, è possibile vederli.

Un esempio

Hazaa Classe:

public partial class Hazaa 
{ 
    public int Shazoo { get; set; } 
} 

HazaaMetadata Classe

[MetadataType(typeof(HazaaMetadata))] 
public partial class Hazaa 
{ 
} 

public class HazaaMetadata 
{ 
    [DisplayName("Shazoo Name")] 
    public int Shazoo { get; set; } 
} 

ASP.NET MVC Uso

non è necessario fare altro per rendere operativo il DisplayName, è possibile utilizzare semplicemente Html.Labelfor o Html.DisplayNameForm per vedere l'impatto. Mostrerà "Nome Shazoo" come testo dell'etichetta.

Windows Form Uso

Alcuni dove nella vostra applicazione (come carico della forma, principale, ...) registrare il provider in questo modo:

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa)); 
TypeDescriptor.AddProvider(provider, typeof(Hazaa)); 

E come risultato, si vedrà PropertyGrid e DataGridView utilizzano "Nome Shazoo" come didascalia per la proprietà e il titolo della colonna.

+0

Questo è troppo lungo per essere utile nel mio caso. Tuttavia, sembra un contributo interessante e, senza averlo provato, ti prendo in parola, hehe. +1 per un approccio ambizioso, sicuramente! –

+0

Grazie per il vostro feedback, questo approccio è molto utilizzato in ASP.NET MVC o in soluzioni che utilizzano la generazione del codice. In questo modo è possibile aggiungere alcuni attributi a una classe senza toccare la classe stessa, specialmente nei casi in cui la classe principale è stata generata utilizzando un tool (t4, ef, ...). –

+0

Lo è? In questo momento sto facendo ASP.NET e il codice generato automaticamente è fantastico e terribile. Forse finirò per usare il tuo suggerimento comunque, ma essendo umano, preferisco la maggior parte delle cose da creare per me, hehe. –