Atributos mais úteis [fechado]

784

Eu sei que os atributos são extremamente úteis. Existem alguns predefinidos, como o [Browsable(false)]que permite ocultar propriedades na guia de propriedades. Aqui está uma boa pergunta para explicar os atributos: O que são atributos no .NET?

Quais são os atributos predefinidos (e seu espaço para nome) que você realmente usa em seus projetos?

wusher
fonte
27
Que pergunta? , a página inteira está repleta de respostas bonitas com explicações maravilhosas. Enquanto estou lendo isso, tive experiência como entrevistar muitos especialistas sobre sua visão. +100 para a pergunta.
Muthu Ganapathy Nathan
Concordo que perguntas como essa são algumas das mais valiosas - tornam o SO menos útil que ele seja fechado.
David Thielen

Respostas:

669

[DebuggerDisplay]pode ser realmente útil ver rapidamente a saída personalizada de um Type quando você passa o mouse sobre a instância do Type durante a depuração. exemplo:

[DebuggerDisplay("FirstName={FirstName}, LastName={LastName}")]
class Customer
{
    public string FirstName;
    public string LastName;
}

É assim que deve aparecer no depurador:

texto alternativo

Além disso, vale ressaltar que o [WebMethod]atributo com CacheDurationconjunto de propriedades pode evitar a execução desnecessária do método de serviço da web.

Vivek
fonte
62
Uau, é muito bom saber disso. Eu geralmente consegui a mesma coisa substituindo o ToString, mas isso é melhor.
Brian Brian
17
Tenha cuidado com isso, ele arranca um pedaço muito maior da sua CPU do que o ToString.
Nikola Radosavljević
1
Você também pode usar isso para exibir o resultado dos métodos. Isso pode resultar em uma experiência de depuração bastante confusa se o método (ou property-get) tiver efeitos colaterais.
Øyvind Skaar
4
@ NikolaRadosavljević consumiria apenas a CPU durante a depuração #
Nickolay Kondratyev
2
@Nickolay Kondratyev: Não conheço todos os detalhes, mas você pode dar uma olhada nas seguintes práticas recomendadas de serviços da Web, que podem levá-lo a algumas conclusões: blogs.msdn.com/b/jaredpar/archive/2011/03/ 18 /…
Nikola Radosavljević
273

System.Obsoleteé um dos atributos mais úteis na estrutura, na minha opinião. A capacidade de emitir um aviso sobre código que não deve mais ser usado é muito útil. Adoro ter uma maneira de dizer aos desenvolvedores que algo não deve mais ser usado, além de explicar o porquê e apontar a melhor / nova maneira de fazer alguma coisa.

Também Conditional attributeé bastante útil para o uso de depuração. Ele permite que você adicione métodos no seu código para fins de depuração que não serão compilados quando você criar sua solução para lançamento.

Existem muitos atributos específicos dos controles da Web que considero úteis, mas esses são mais específicos e não têm nenhum uso fora do desenvolvimento dos controles do servidor, conforme descobri.

Dan Herbert
fonte
50
Você pode passar "true" como um dos parâmetros para System.Obsolete, que faz com que o aviso se torne um erro e, portanto, quebre a compilação. Obviamente, isso deve ser feito depois de limpar todos os avisos. :)
Adrian Clark
14
Depois de limpar todos os avisos, não seria melhor excluir o método?
Pedro
10
@ Pedro: Às vezes você não pode, por razões de compatibilidade com versões anteriores. Se for privado e não usado, exclua-o.
Fantius 2/06/09
3
@ plinth Lançar uma exceção seria uma péssima idéia por vários motivos, sendo o principal o motivo para usar Obsolete (), para que você possa manter o código compilado trabalhando durante uma fase de transição. Se você não está permitindo que alguém chame o método, por que não excluí-lo?
Dan Herbert
17
@ plinth É para impedir que o novo código use o método O código antigo permanecerá compatível com o binário se um método estiver marcado como obsoleto, mas parará de funcionar se você lançar uma exceção. Se alguém está usando a reflexão para obter em torno da bandeira "Obsolte", então você tem problemas piores ...
Dan Herbert
204

[Flags]é bastante útil. Açúcar sintático, com certeza, mas ainda assim bastante agradável.

[Flags] 
enum SandwichStuff
{
   Cheese = 1,
   Pickles = 2,
   Chips = 4,
   Ham = 8,
   Eggs = 16,
   PeanutButter = 32,
   Jam = 64
};

public Sandwich MakeSandwich(SandwichStuff stuff)
{
   Console.WriteLine(stuff.ToString());
   // ...
}

// ...

MakeSandwich(SandwichStuff.Cheese 
   | SandwichStuff.Ham 
   | SandwichStuff.PeanutButter);
// produces console output: "Cheese, Ham, PeanutButter"

Leppie aponta algo que eu não tinha percebido e que diminui meu entusiasmo por esse atributo: ele não instrui o compilador a permitir combinações de bits como valores válidos para variáveis ​​de enumeração, o compilador permite isso de enumerações independentemente. Meu plano de fundo em C ++ mostrando através de ... suspiro

Shog9
fonte
Então, o que exatamente o atributo Flags faz?
Andrei Rînea 28/09/08
13
Espero que vocês percebam que o atributo Flags incomoda tudo. Não é necessário / utilizado, exceto para o TypeConverter.
leppie
3
@leppie: ToString () também. Mas ... uau. Por alguma razão, eu esperava que o comportamento de enumerações sem o atributo fosse o mesmo que C ++: ou os valores produzem um número inteiro (não pode ser passado como é para o método expect enum param). Vejo agora que não é esse o caso. Fraco ... ok, enums do .NET sugam.
Shog9
2
[Flags] realmente ajuda apenas as funções depurador e .ToString () a saber que um valor é potencialmente uma combinação de várias declarações na enumeração. Não tenho certeza, isso pode fazer o Intellisense ajudá-lo a usar o enum de maneira mais eficaz também.
Kenzi
31
[Flags]tem um uso maior do que ser apenas açúcar sintático. Ao usar serviços da Web, a serialização / desserialização não funcionará se um valor como SandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jamfor passado. Sem o [Flags]atributo, o desserializador não saberá que o valor pode ser uma combinação de sinalizadores. Aprendi isso da maneira mais difícil depois de passar cerca de dois dias pensando por que meu WCF não estava funcionando.
Anchit
177

Eu gosto [DebuggerStepThrough]de System.Diagnostics .

É muito útil para evitar a invasão de métodos ou propriedades de uma linha sem fazer nada (se você for forçado a trabalhar em um .Net inicial sem propriedades automáticas). Coloque o atributo em um método curto ou no getter ou setter de uma propriedade, e você voará direto mesmo quando pressionar "entrar" no depurador.

Blair Conrad
fonte
5
Tantas vezes eu desejo que eu sabia sobre este imóvel
wusher
1
É uma pena que esteja quebrado com os fechamentos - consulte gregbeech.com/blogs/tech/archive/2008/10/17/… para obter mais informações.
Greg Beech
3
Também útil para qualquer Código WM_PAINT que você sabe que funciona :)
Pondidum
@GregBeech Esse URL retorna um erro do .NET. Com classe! :)
smdrager
@ Smdrager - deve ter sido um problema temporário, parece funcionar para mim hoje.
Greg Beech
135

Para o que vale, aqui está uma lista de todos os atributos do .NET . Existem várias centenas.

Não conheço mais ninguém, mas tenho um RTFM sério para fazer!

wprl
fonte
33
lista afixada é para .net 1.1 aqui está a lista para 3,5 msdn.microsoft.com/en-us/library/system.attribute.aspx (Você tem que rolar um pouco para baixo)
kay.one
2
Atualizado o link na pergunta. Agora é a lista completa de 3.5
R. Martinho Fernandes
8
Na verdade, isso vincula o mais recente, não o 3.5 especificamente.
Brian Ortiz
1
Agora, se a lista não fosse apenas uma lista de links, mas o nome e a descrição. Ah bem. @BrianOrtiz está certo. A lista está na versão 4.5.
Luminoso
Você acabou de alterar a estrutura que está alvejando na parte superior, onde diz "Outras versões".
Novaterata
129

Meu voto seria para Conditional

[Conditional("DEBUG")]
public void DebugOnlyFunction()
{
    // your code here
}

Você pode usar isso para adicionar uma função com recursos avançados de depuração; como Debug.Write, é chamado apenas em compilações de depuração e, portanto, permite que você encapsule lógica de depuração complexa fora do fluxo principal do seu programa.

Steve Cooper
fonte
5
não é o mesmo que fazer #if DEBUG?
911 Neil N
10
De certa forma, #if DEBUG significa que o chamador também não deve chamá-lo, enquanto o Conditioinal sai da chamada, mas faz dele um NOP que é eliminado no JIT.
Rangoric 14/03
23
Além disso, você normalmente usaria #if DEBUG em torno de chamadas e [Condicional] em torno de métodos . Então, se você chamar um método de depuração 100 vezes, desligá-lo é uma questão de uma única alteração de código, não 100.
Steve Cooper
13
O comentário de Rangoric está sutilmente errado (pelo menos em C #): o método está incluído sem modificação; o próprio site de chamada é omitido. Isso tem algumas implicações: os parâmetros não são avaliados e o método condicional está contido, não modificado, na saída do compilador. Você pode verificar isso com reflexão. msdn.microsoft.com/en-us/library/aa664622.aspx blogs.msdn.com/b/jmstall/archive/2007/10/15/...
Mark Sowul
97

Eu sempre uso os atributos DisplayName, Descriptione DefaultValuenas propriedades públicas dos meus controles de usuário, controles personalizados ou qualquer classe que editarei através de uma grade de propriedades. Essas tags são usadas pelo .NET PropertyGrid para formatar o nome, o painel de descrição e os valores em negrito que não estão definidos para os valores padrão.

[DisplayName("Error color")]
[Description("The color used on nodes containing errors.")]
[DefaultValue(Color.Red)]
public Color ErrorColor
{
    ...
} 

Eu só gostaria que o IntelliSense do Visual Studio levasse o Descriptionatributo em consideração se nenhum comentário XML fosse encontrado. Evitaria ter que repetir a mesma frase duas vezes.

Anthony Brien
fonte
3
Não posso acreditar que ninguém apontou Descriptionaté que você .. É o mais útil para mim quando usado com enums ..
Nawfal
68

[Serializable]é usado o tempo todo para serializar e desserializar objetos de e para fontes de dados externas, como xml ou de um servidor remoto. Mais sobre isso aqui.

Gilligan
fonte
Na verdade, é encaminhado para um psuedoattribute, como C # emite uma bandeira de metadados para [Serializable], não uma instância de atributo personalizado;)
TraumaPony
1
Embora muito útil [Serializable] esteja longe de ser perfeito. Exige muita correção, tentativa e erro para obter o resultado desejado.
shoosh 4/01/09
Eu segundo que shoosh!
John Bubriski
System.NonSerializedAttribute é útil se você deseja ter mais controle sobre a serialização automática.
CSharper
Como observação lateral, eu acrescentaria que o desempenho da serialização .Net interna é muito ruim, como 2 ou 3 ordens de magnitude mais lentas do que o código artesanal.
redcalx
57

No espírito Hofstadt, o [Attribute]atributo é muito útil, pois é assim que você cria seus próprios atributos. Eu usei atributos em vez de interfaces para implementar sistemas de plugins, adicionar descrições ao Enums, simular vários despachos e outros truques.

C. Lawrence Wenham
fonte
13
Parece legal! Você se importaria de mostrar alguns exemplos do sistema de plug-ins e das descrições de enum? Essas são as duas coisas que eu estou interessado em me implementar!
John Bubriski
46

Aqui está o post sobre o interessante atributo InternalsVisibleTo . Basicamente, o que ele faz simula a funcionalidade de acesso a amigos em C ++. É muito útil para testes de unidade.

xrost
fonte
7
Você não quer dizer útil para invadir um teste de unidade em algo que não poderia / não deveria ser testado?
the_drow
@the_drow: Você fala sobre 'acessadores particulares': msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx
habakuk
@habakuk: Na verdade não. Há casos em que as classes internas devem ser expostas para testes de unidade, geralmente devido a um design inadequado.
12133
2
@the_drow: eu não diria que InternalsVisibleTo é mau para testes de unidade; você pode criar e testar "unidades" menores que não são visíveis fora do seu projeto (ajuda a ter uma API limpa e pequena). Mas se você precisar de 'acessadores particulares' para testar alguma coisa, provavelmente há algo errado.
Habakuk
10
@the_drow Não concordo com sua afirmação de que internalnão é pública. É público na montagem que está sendo testada e deve ser testado em unidade para que outras classes na montagem possam assumir a funcionalidade de correção. Se você não fizer o teste unitário, precisará testar suas funções em todas as classes de consumo.
tvanfosson
28

Eu sugiro [TestFixture]e [Test]- da biblioteca nUnit .

Os testes de unidade no seu código fornecem segurança na refatoração e na documentação codificada.

Adrian Wible
fonte
26
[XmlIgnore]

pois isso permite que você ignore (em qualquer serialização xml) objetos 'pai' que de outra forma causariam exceções ao salvar.

Jimi
fonte
25

Não é bem nomeado, não é bem suportado na estrutura e não deve exigir um parâmetro, mas esse atributo é um marcador útil para classes imutáveis:

[ImmutableObject(true)]
Neil Whitaker
fonte
6
De acordo com os documentos, usado apenas em tempo de design (infelizmente).
Hans Keing
1
Dado que esse é apenas o tempo de design, talvez seja melhor criar sua própria ImmutableObjectAttributeclasse - pelo menos você pode eliminar o parâmetro.
Roy Tinker
25

Eu gosto de usar o [ThreadStatic]atributo em combinação com programação baseada em thread e pilha. Por exemplo, se eu quero um valor que quero compartilhar com o restante de uma sequência de chamadas, mas quero fazê-lo fora da banda (ou seja, fora dos parâmetros de chamada), posso empregar algo assim.

class MyContextInformation : IDisposable {
    [ThreadStatic] private static MyContextInformation current;

    public static MyContextInformation Current {
        get { return current; }
    }

    private MyContextInformation previous;


    public MyContextInformation(Object myData) {
       this.myData = myData;
       previous = current;
       current = this;
    }

    public void Dispose() {
       current = previous;
    }
}

Posteriormente no meu código, eu posso usá-lo para fornecer informações contextuais fora da banda para as pessoas a jusante do meu código. Exemplo:

using(new MyContextInformation(someInfoInContext)) {
   ...
}

O atributo ThreadStatic permite que eu faça o escopo da chamada apenas para o segmento em questão, evitando o problema confuso do acesso a dados entre segmentos.

Ajaxx
fonte
e como acessar então? Não entenda o ponto da sua amostra de uso aqui. Você pode explicar?
Beachwalker
@Beachwalker Current deve ser estático, edite-o agora. Agora você pode acessar MyContextInformation.Currentpara obter o contexto ativo na pilha. Isso é algo que é um conceito muito bom em certos casos, nosso mecanismo (da minha empresa) o usa para vários propósitos.
Felix K.Jan
23

O DebuggerHiddenAttribute que permite evitar a etapa do código que não deve ser depurado.

public static class CustomDebug
{
    [DebuggerHidden]
    public static void Assert(Boolean condition, Func<Exception> exceptionCreator) { ... }
}

...

// The following assert fails, and because of the attribute the exception is shown at this line
// Isn't affecting the stack trace
CustomDebug.Assert(false, () => new Exception()); 

Também impede a exibição de métodos no rastreamento de pilha, útil ao ter um método que apenas envolve outro método:

[DebuggerHidden]
public Element GetElementAt(Vector2 position)
{
    return GetElementAt(position.X, position.Y);
}

public Element GetElementAt(Single x, Single y) { ... }

Se você chamar agora GetElementAt(new Vector2(10, 10))e ocorrer um erro no método agrupado, a pilha de chamadas não mostrará o método que está chamando o método que gera o erro.

Felix K.
fonte
21

DesignerSerializationVisibilityAttributeé muito útil. Quando você coloca uma propriedade de tempo de execução em um controle ou componente e não deseja que o designer a serialize, use-a assim:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Foo Bar {
    get { return baz; }
    set { baz = value; }
}
configurador
fonte
4
muito útil para componentes WinForms. use em conjunto com [Navegável (falso)] #
Mark Heath
3
Bom ponto - [Browsable(false)]é necessário para ocultá-lo do usuário do designer, onde [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]é necessário para que não seja serializado.
configurator
17

Apenas alguns atributos recebem suporte do compilador, mas um uso muito interessante de atributos está no AOP: o PostSharp usa seus atributos personalizados para injetar IL nos métodos, permitindo que todo tipo de habilidades ... log / trace sejam exemplos triviais - mas outros bons exemplos são coisas como a implementação automática de INotifyPropertyChanged ( aqui ).

Algumas que ocorrem e afetam diretamente o compilador ou o tempo de execução :

  • [Conditional("FOO")] - as chamadas para esse método (incluindo avaliação de argumentos) só ocorrem se o símbolo "FOO" for definido durante a compilação
  • [MethodImpl(...)] - usado para indicar algumas coisas como sincronização, inlining
  • [PrincipalPermission(...)] - usado para injetar verificações de segurança no código automaticamente
  • [TypeForwardedTo(...)]- usado para mover tipos entre montagens sem reconstruir os chamadores

Para coisas que são verificadas manualmente via reflexão - eu sou um grande fã dos System.ComponentModelatributos; coisas como [TypeDescriptionProvider(...)], [TypeConverter(...)]e [Editor(...)]que podem alterar completamente o comportamento de tipos em cenários de ligação de dados (ou seja, propriedades dinâmicas, etc).

Marc Gravell
fonte
15

Se eu fizesse um rastreamento de cobertura de código, acho que esses dois seriam os principais:

 [Serializable]
 [WebMethod]
FlySwat
fonte
15
[WebMethod] é usado para decorar um método exposto em um serviço da web. [Serializable] marca seus objetos de forma que eles possam ser serializados para fins como passar por domínios de aplicativos.
Kev
15

Eu tenho usado o [DataObjectMethod]ultimamente. Ele descreve o método para que você possa usar sua classe com o ObjectDataSource (ou outros controles).

[DataObjectMethod(DataObjectMethodType.Select)] 
[DataObjectMethod(DataObjectMethodType.Delete)] 
[DataObjectMethod(DataObjectMethodType.Update)] 
[DataObjectMethod(DataObjectMethodType.Insert)] 

Mais informações

limpador
fonte
12

Em nosso projeto atual, usamos

[ComVisible(false)]

Controla a acessibilidade de um tipo ou membro gerenciado individual ou de todos os tipos em um assembly ao COM.

Mais informações

Ahmed
fonte
12
[TypeConverter(typeof(ExpandableObjectConverter))]

Diz ao designer para expandir as propriedades que são classes (de seu controle)

[Obfuscation]

Instrui as ferramentas de ofuscação a executar as ações especificadas para uma montagem, tipo ou membro. (Embora normalmente você use um nível de montagem[assembly:ObfuscateAssemblyAttribute(true)]

Chris S
fonte
1
Eu acho, mas estava errado. O atributo Ofuscação é apenas uma dica para obfsucators de terceiros. Não faz com que o compilador ofusque nada por padrão.
Dan Is Fiddling Por Firelight
@ DanNeely gratuito para usuários do Visual Studio Pro / Ultimate!
Chris S
4
Se você está se referindo ao DotFuscator Community Edition, o nível de proteção é tão baixo que, na melhor das hipóteses, quase não conta para nada.
Dan Is Fiddling Por Firelight
@ricovox Adicionei um resumo
Chris S
9

Os atributos que eu mais uso são os relacionados à serialização de XML.

XmlRoot

XmlElement

XmlAttribute

etc ...

Extremamente útil ao realizar qualquer análise ou serialização XML rápida e suja.

Brannon
fonte
8

Sendo um desenvolvedor de nível intermediário, eu gosto

System.ComponentModel.EditorBrowsableAttribute Permite ocultar propriedades para que o desenvolvedor da interface do usuário não fique sobrecarregado com propriedades que eles não precisam ver.

System.ComponentModel.BindableAttributeAlgumas coisas não precisam ser vinculadas. Novamente, diminui o trabalho que os desenvolvedores da interface do usuário precisam fazer.

Também gosto do DefaultValueque Lawrence Johnston mencionou.

System.ComponentModel.BrowsableAttributee Flagssão usados ​​regularmente.

Eu uso System.STAThreadAttribute System.ThreadStaticAttribute quando necessário.

A propósito. Estes são igualmente valiosos para todos os desenvolvedores de framework .Net.

ElGringoGrande
fonte
8

[EditorBrowsable(EditorBrowsableState.Never)]permite ocultar propriedades e métodos do IntelliSense se o projeto não estiver em sua solução. Muito útil para ocultar fluxos inválidos para interfaces fluentes. Com que frequência você deseja GetHashCode () ou Equals ()?

Para o MVC, [ActionName("Name")]você pode ter uma ação Get e Post action com a mesma assinatura de método, ou usar traços no nome da ação, o que de outra forma não seria possível sem a criação de uma rota para ela.

smdrager
fonte
8

Considero importante mencionar aqui que os seguintes atributos também são muito importantes:

STAThreadAttribute 

Indica que o modelo de encadeamento COM para um aplicativo é STA (single-threaded apartment).

Por exemplo, este atributo é usado no Windows Forms Applications:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

E também ...

SuppressMessageAttribute

Suprime o relatório de uma violação específica da regra da ferramenta de análise estática, permitindo várias supressões em um único artefato de código.

Por exemplo:

[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "isChecked")]
[SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "fileIdentifier")]
static void FileNode(string name, bool isChecked)
{
    string fileIdentifier = name;
    string fileName = name;
    string version = String.Empty;
}
Eric Javier Hernandez Saura
fonte
O STAThread é usado para impedir que seu aplicativo desative acidentalmente outra instância de si mesmo na inicialização?
Luminous
7

Em primeiro lugar, aqui está uma lista rápida, mais ou menos classificada por frequência de uso, de atributos predefinidos que eu realmente uso em um grande projeto (~ 500k LoCs):

Sinalizadores, Serializáveis, WebMethod, COMVisible, TypeConverter, Condicional, ThreadStatic, Obsoleto, InternalsVisibleTo, DebuggerStepThrough.

Eldritch Conundrum
fonte
2
+1 para ThreadStatic, surpreso que ninguém tenha mencionado até agora, e também para a abordagem estatística
staafl
6

Gero classe de entidade de dados via CodeSmith e uso atributos para alguma rotina de validação. Aqui está um exemplo:

/// <summary>
/// Firm ID
/// </summary>
[ChineseDescription("送样单位编号")]
[ValidRequired()]
public string FirmGUID
{
    get { return _firmGUID; }
    set { _firmGUID = value; }
}

E eu tenho uma classe de utilitário para fazer a validação com base nos atributos anexados à classe de entidade de dados. Aqui está o código:

namespace Reform.Water.Business.Common
{
/// <summary>
/// Validation Utility
/// </summary>
public static class ValidationUtility
{
    /// <summary>
    /// Data entity validation
    /// </summary>
    /// <param name="data">Data entity object</param>
    /// <returns>return true if the object is valid, otherwise return false</returns>
    public static bool Validate(object data)
    {
        bool result = true;
        PropertyInfo[] properties = data.GetType().GetProperties();
        foreach (PropertyInfo p in properties)
        {
            //Length validatioin
            Attribute attribute = Attribute.GetCustomAttribute(p,typeof(ValidLengthAttribute), false);
            if (attribute != null)
            {
                ValidLengthAttribute validLengthAttribute = attribute as ValidLengthAttribute;
                if (validLengthAttribute != null)
                {
                    int maxLength = validLengthAttribute.MaxLength;
                    int minLength = validLengthAttribute.MinLength;
                    string stringValue = p.GetValue(data, null).ToString();
                    if (stringValue.Length < minLength || stringValue.Length > maxLength)
                    {
                        return false;
                    }
                }
            }
            //Range validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRangeAttribute), false);
            if (attribute != null)
            {
                ValidRangeAttribute validRangeAttribute = attribute as ValidRangeAttribute;
                if (validRangeAttribute != null)
                {
                    decimal maxValue = decimal.MaxValue;
                    decimal minValue = decimal.MinValue;
                    decimal.TryParse(validRangeAttribute.MaxValueString, out maxValue);
                    decimal.TryParse(validRangeAttribute.MinValueString, out minValue);
                    decimal decimalValue = 0;
                    decimal.TryParse(p.GetValue(data, null).ToString(), out decimalValue);
                    if (decimalValue < minValue || decimalValue > maxValue)
                    {
                        return false;
                    }
                }
            }
            //Regex validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRegExAttribute), false);
            if (attribute != null)
            {
                ValidRegExAttribute validRegExAttribute = attribute as ValidRegExAttribute;
                if (validRegExAttribute != null)
                {
                    string objectStringValue = p.GetValue(data, null).ToString();
                    string regExString = validRegExAttribute.RegExString;
                    Regex regEx = new Regex(regExString);
                    if (regEx.Match(objectStringValue) == null)
                    {
                        return false;
                    }
                }
            }
            //Required field validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRequiredAttribute), false);
            if (attribute != null)
            {
                ValidRequiredAttribute validRequiredAttribute = attribute as ValidRequiredAttribute;
                if (validRequiredAttribute != null)
                {
                    object requiredPropertyValue = p.GetValue(data, null);
                    if (requiredPropertyValue == null || string.IsNullOrEmpty(requiredPropertyValue.ToString()))
                    {
                        return false;
                    }
                }
            }
        }
        return result;
    }
}
}
Ming Yeh
fonte
6

[DeploymentItem("myFile1.txt")] Doc do MSDN sobre DeploymentItem

Isso é realmente útil se você estiver testando em um arquivo ou usando o arquivo como entrada para o seu teste.

Kevin Driedger
fonte
5

[System.Security.Permissions.PermissionSetAttribute] permite que ações de segurança para um PermissionSet sejam aplicadas ao código usando segurança declarativa.

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}
CSharper
fonte