Domanda

Ho visto il seguente codice:

[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...} 

La funzionalità dello snippit sopra sembra abbastanza chiara, non ho idea di come posso usarla per fare cose utili. Non sono nemmeno sicuro di quale nome dargli!

Qualcuno sa dove posso trovare maggiori informazioni / un tutorial su questi attributi di proprietà? Sarei anche interessato a qualsiasi nuovo / utile compito che questa funzione possa svolgere.

È stato utile?

Soluzione

Le persone hanno già coperto l'aspetto dell'interfaccia utente - gli attributi hanno altri usi, anche se ... per esempio, sono ampiamente utilizzati nella maggior parte dei framework di serializzazione. Ad alcuni attributi viene assegnato un trattamento speciale dal compilatore, ad esempio [PrincipalPermission (...)] aggiunge la sicurezza dichiarativa a un metodo, consentendo di verificare (automaticamente) che l'utente abbia un accesso adeguato.

Per aggiungere la tua gestione speciale, puoi utilizzare PostSharp ; ci sono molti ottimi esempi dell'utilizzo di PostSharp per eseguire operazioni AOP, come la registrazione - o semplicemente la semplificazione del codice, ad esempio con implementazione automatica INotifyPropertyChanged .

Altri suggerimenti

  

La funzionalità di cui sopra   snippit sembra abbastanza chiaro,

Forse no, poiché molte persone pensano che [DefaultValue ()] imposta il valore della proprietà. In realtà, tutto ciò che serve per dire ad alcuni designer visivi (ad esempio Visual Studio), su quale codice verrà impostato il valore predefinito. In questo modo sa grassetto il valore nella finestra delle proprietà se è impostato su qualcos'altro.

Quelli nel tuo esempio sono usati dal designer visivo (ad esempio MS Expression Blend e designer di Visual Studio) per fornire suggerimenti nell'interfaccia utente del designer.

Nota che sono metadati e non influenzeranno la logica delle proprietà. L'impostazione di DefaultValue ad esempio non imposterà la proprietà su quel valore per impostazione predefinita, devi farlo manualmente.

Se per qualche motivo desideri accedere a questi attributi, dovresti utilizzare riflessione .

Vedi MSDN per ulteriori informazioni sugli attributi del designer.

Si chiamano Attributi, ci sono molte informazioni in msdn, ad es. http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

In generale non " do " qualsiasi cosa da soli, vengono utilizzati da qualche altro codice che utilizzerà la tua classe. XmlSerialization è un buon esempio: XmlSerializer (fornito da Microsoft come parte del framework) può quasi qualsiasi classe (ci sono una serie di requisiti sulla classe però) - usa la riflessione per vedere quali dati sono contenuti nella classe. Puoi usare gli attributi (definiti insieme a XmlSerializer) per cambiare il modo in cui XmlSerializer serializzerà la tua classe (ad es. Digli di salvare i dati come attributo anziché come elemento).

Lo usiamo per definire quale designer grafico dovrebbe essere caricato per configurare un'istanza di un tipo specifico.

Vale a dire, abbiamo una sorta di designer del flusso di lavoro che carica tutti i possibili comandi tipi da un assembly. Questi tipi di comando hanno proprietà che devono essere configurate, quindi ogni tipo di comando ha bisogno di un designer diverso (usercontrol).

Ad esempio, considera il seguente tipo di comando (chiamato composito nella nostra soluzione)

[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase 
{
       // code here
}

Queste informazioni sono utilizzate in due punti

1) Quando il designer crea un elenco di comandi, utilizza CompositeMetaData    per visualizzare ulteriori informazioni sul comando.

2) Quando l'utente aggiunge un comando al designer e il designer crea    un'istanza di quella classe, guarda la proprietà CompositeDesigner,    crea una nuova istanza del tipo specificato (usercontrol) e la aggiunge    al visual designer.

Considera il seguente codice, che usiamo per caricare i comandi nella nostra " toolbar " ;:

foreach (Type t in assembly.GetExportedTypes())  
{
    Console.WriteLine(t.Name);

    if (t.Name.EndsWith("Composite"))
    {
        var attributes = t.GetCustomAttributes(false);
        ToolboxListItem item = new ToolboxListItem();

        CompositeMetaDataAttribute meta = (CompositeMetaDataAttribute)attributes
                              .Where(a => a.GetType() == typeof(Vialis.LightLink.Attributes.CompositeMetaDataAttribute)).First();
        item.Name = meta.DisplayName;
        item.Description = meta.Description;
        item.Length = meta.Length;
        item.CompositType = t;

        this.lstCommands.Items.Add(item);
    }                           
}

Come puoi vedere, per ogni tipo nell'assieme di cui il nome termina con " Composito " ;, otteniamo gli attributi personalizzati e utilizziamo tali informazioni per popolare la nostra istanza ToolboxListItem.

Per quanto riguarda il caricamento del designer, l'attributo viene recuperato in questo modo:

var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false)
                         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault();

Questo è solo un esempio di come potresti essere in grado di usare attributi personalizzati,

Spero che questo ti dia un punto di partenza.

Questi attributi personalizzano l'esperienza in fase di progettazione.

http://msdn.microsoft.com/en-us/library /a19191fh.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top