Pergunta

Eu vi o código a seguir:

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

A funcionalidade do snippit acima parece bastante claro, eu não tenho nenhuma idéia de como eu posso usá-lo para fazer coisas úteis. Im nem mesmo certeza quanto ao que nome dar-lhe!

Alguém sabe onde posso encontrar mais informações / um tutorial sobre esses atributos de propriedade? Eu estaria também interessado em quaisquer novas tarefas / úteis esta funcionalidade pode fazer.

Foi útil?

Solução

As pessoas já cobrimos o aspecto UI - atributos têm outros usos, embora ... por exemplo, eles são usados ??extensivamente na maioria dos frameworks de serialização. Alguns atributos são dadas tratamento especial pelo compilador - por exemplo, [PrincipalPermission(...)] adiciona segurança declarativa para um método, permitindo que você (automaticamente) Verifique se o usuário tem acesso adequado

.

Para adicionar seu próprio tratamento especial, você pode usar PostSharp ; há muitos grandes exemplos de como usar PostSharp para fazer coisas AOP, como logging - ou simplificação do código apenas, como com automática implementação INotifyPropertyChanged .

Outras dicas

A funcionalidade do exposto snippit parece bastante claro,

Talvez não, como muitas pessoas pensam que [DefaultValue ()] sets do valor do imóvel. Na verdade, tudo que faz para dizer alguma designer visual (por exemplo, Visual Studio), o que o código vai definir o valor padrão para. Dessa forma, ele sabe que negrito o valor na janela de propriedades se ele é definido como algo mais.

Os de seu exemplo é usado pelo designer visual (ou seja, MS Expression Blend e Visual Designer Studio) para dar dicas na UI designer.

Note que eles são metadados e não afetará a lógica propriedade. Ajuste DefaultValue por exemplo, não defina a propriedade como esse valor por padrão, você tem que fazer isso manualmente.

Se você por algum motivo deseja acessar esses atributos, você teria que reflexão .

MSDN para obter mais informações sobre atributos de grife.

Eles são chamados atributos, há um monte de informações no MSDN, por exemplo, http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

Em geral eles não "fazer" qualquer coisa por conta própria, eles são usados ??por algum outro código que irá utilizar sua classe. XmlSerialization é um bom exemplo: XmlSerializer (fornecido pela Microsoft como parte do quadro) pode quase qualquer classe (há uma série de exigências sobre a classe embora) - ele usa reflexão para ver os dados que está contido na classe. Você pode usar atributos (definidos em conjunto com XmlSerializer) para mudar a maneira XmlSerializer serializará sua classe (por exemplo, diga a ele para salvar os dados como atributo em vez de um elemento).

Vamos utilizá-lo para definir quais designer gráfico deve ser carregado para configure uma instância de um tipo específico.

Ou seja, temos uma espécie de designer de fluxo de trabalho que carrega todos os possíveis comando tipos de uma montagem. Estes tipos de comando têm propriedades que precisam de ser configurado, assim que cada tipo de comando tem a necessidade de um designer diferente (usercontrol).

Por exemplo, considere o seguinte tipo de comando (chamado de um composto em nossa solução)

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

Esta é informação é usada em dois lugares

1) Quando o designer cria uma lista de comandos, ele usa o CompositeMetaData para exibir mais informações sobre o comando.

2) Quando o usuário adiciona um comando para o designer eo designer cria uma instância dessa classe, ele olha para a propriedade CompositeDesigner, cria uma nova instância do tipo especificado (usercontrol) e adiciona-lo para o designer visual.

Considere o seguinte código, que usamos para carregar os comandos em nossa "barra de ferramentas":

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);
    }                           
}

Como você pode ver, para cada tipo na montagem de que o nome termina com "Composite", obtemos os atributos personalizados e usar essa informação para preencher o nosso exemplo ToolboxListItem.

Como para carregar o designer, o atributo é recuperada como esta:

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

Este é apenas um exemplo de como você pode ser capaz de usar atributos personalizados,

Espero que isso lhe dá um lugar para começar.

Estes atributos personalizar a experiência de tempo de design.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top