Pergunta

Que tipo de coisas você usou atributos personalizados .NET pois no mundo real?

Já li vários artigos sobre eles, mas eu nunca usei atributos personalizados.

Eu sinto que eu poderia estar com vista para eles quando eles poderiam ser úteis.

Estou a falar de atributos que você cria, não aqueles que já estão incluídos no quadro.

Foi útil?

Solução

Eu usei-os "custom" atributos para validação (ie. Marcação de um campo para ser validado com o meu próprio "validação de cartão de crédito") e analisadores LinqToLucene personalizados que eu escrevi (ie. Especificando quais analisador para uso em um campo de dado).

O código de validação, por exemplo, seria algo parecido com isto:

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

Quando o objeto acima é validado, cada campo é validado com o validador graças apropriados para o atributo "custom".

atributos personalizados

Na coisas LinqToLucene que eu escrevi são bons porque eles permitem que você encontrar (através da reflexão) campos específicos em tempo de execução. Por exemplo, se você tem um objeto cliente, você pode estar interessado em obter todas as propriedades que foram marcados como "índice de mim": um atributo personalizado permite fazer isso facilmente, uma vez que expõe meta-dados sobre o objeto de uma maneira que é fácil consulta.

Outras dicas

Eu criei um mecanismo de script, e marcou vários métodos com o atributo [Command]. Isto significa que estas funções foram expostos ao mecanismo de script.

Exemplo:

[Command(HelpText = "Lists active users")]
void ListUsers(void)
{

}

[Command(HelpText = "Terminate a specific user's connection")]
void EndConnection(int userID)
{

}

E como usado:

MyScriptEngine>>  Help
Available Commands are:
    ListUsers: Lists active users
    EndConnection {userID}: Terminate a specific user's connection

MyScriptEngine>> EndConnection 3
    User 3 (Michael) has had his connection terminated.

MyScriptEngine>>

Entre outras coisas, eu usei-os para especificar EBNF que é lido em tempo de execução para criar analisadores personalizados em tempo real e também para especificar metadados sobre campos para um banco de dados.

eu encontrar um 'padrão' Estou comumente usando atributos personalizados é substituir enums especialmente quando há uma dependência no enum em diff lugares no código.

por exemplo. Eu poderia ter um enum para um estado de um objeto. Com base neste estado, eu tenho talvez 3 ou 4 lugares diferentes no código que eu faria um 'switch' dessa enumeração e executar alguma operação. Algum outro desenvolvedor poderia facilmente introduzir um bug, adicionando um novo enum, mas não a manipulação em uma das declarações switch em outro lugar no código.

Então, para evitar isso, eu criar um personalizado atributos declarados a uma classe estática. Os atributos personalizados são carregados no construtor estático da classe em um dicionário e todos os lugares em código usar o dicionário em vez de declarações switch. O construtor atributo personalizado contém os valores de 'hard-coded' para cada instrução switch.

Eu tive que serializar alguns objetos para um formato personalizado (legacy), e eu usei atributos para identificar quais campos devem ser serializado e como formatá-los. Então eu tive um serializador que poderia levar qualquer objeto com esses atributos e usar a reflexão para formatá-lo.

Eu realmente não tenho encontrado um uso para o costume de atributos como de ainda. Houve algumas situações em que eu thaught que pode ser apropriado, mas não usá-los porque, aparentemente, a reflexão envolvidos na leitura atributos personalizados é muito caro.

Eu coloquei atributos personalizados em classes dentro de "plug-in" DLLs. Isso permite que um quadro para descobrir dinamicamente plug-ins disponíveis, avaliar se eles são de interesse, e, em seguida, carregar dinamicamente os de interesse.

No nosso domínio, o exemplo é plug-ins que os veículos particulares modelo dentro de uma família. Um plug-in para uma família de veículo possa realmente modelar vários modelos de veículo dentro da família de veículos (por exemplo, "MX-6", "sonda"). Se um ID ou nome do modelo é incluído como uma matriz atributo personalizado, podemos ignorar rapidamente quaisquer DLLs que nem sequer têm atributos personalizados, e depois ignorar ainda mais qualquer que não modelar o veículo de interesse.

Eu tinha usado em um dos quadros ORM que desenvolvi com base no padrão ActiveRecord. Este é o mesmo tipo de aplicação que está disponível em LINQ, projeto castelo etc.

O quadro foi chamado de "SkyFramework", mas não foi opensource.

para e.g. Apenas um exemplo áspero ...

Você vai encontrar exemplos semelhantes em outros projetos de código aberto também.

[Sky.Table ("user")]
public class User
{
    [Sky.Column ("username")]
    public string UserName;

    [Sky.Column ("pwd")]
    public string Password;
}

NOTA: O atributo "Tabela", "Colunas" foram os atributos personalizados na época

.

O motor do ActiveRecord analisa o objeto para esses atributos e gera as respectivas funções para CRUD ... etc ...

Da mesma forma, eu tinha desenvolvido alguns atributos personalizado para identificar porções de código que precisa ser aferido ... por exemplo ..

[Sky.BenchMark()]
public void LongRunningMethod(..)
{
}

Os métodos marcados com os atributos acima são automaticamente banco marcado e um registo é gerado. Estas foram algumas implementações anteriores.

Há um livro Apress disponível no assunto .. Aplicada .NET atributos de e que pode ser de ajuda para você.

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